戈壁红柳 發表於 2025-7-18 10:38:33

一文详解正则表达式中的特殊符号

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">正则表达式中的特殊符号</a></li><li><a href="#_label1">.的作用</a></li><li><a href="#_label2">+的作用</a></li><li><a href="#_label3">?的作用</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_0">情况1:单独使用</a></li><li><a href="#_lab2_3_1">情况2:作为非贪婪修饰符(与量词组合)</a></li></ul><li><a href="#_label4">*的作用</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">^的作用</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">$的作用</a></li><ul class="second_class_ul"></ul><li><a href="#_label7">综合对比表</a></li><ul class="second_class_ul"></ul><li><a href="#_label8">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>正则表达式中的特殊符号</h2>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/.+?hxx/is', hxx));
</pre></div>
<p>返回,0,表示没有匹配,这是因为 <code>.+?</code>的作用,具体讲一下。</p>
<p class="maodian"><a name="_label1"></a></p><h2>.的作用</h2>
<ul><li><strong>作用</strong>:匹配除换行符(<code>\n</code>)以外的任意单个字符。</li><li><strong>修饰符影响</strong>:当使用<code>s</code>修饰符(单行模式)时,<code>.</code>也能匹配换行符。</li></ul>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/a.b/', acb));
</pre></div>
<ul><li><strong>有.时</strong>:可以匹配像<code>aab</code>、<code>acb</code>、<code>a b</code>这样的字符串,因为<code>.</code>可以匹配任意字符(除了换行符,除非使用<code>s</code>修饰符)。</li><li><strong>无.时</strong>(例如<code>/ab/</code>):只能匹配<code>ab</code>,不能匹配中间有其他字符的情况。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>+的作用</h2>
<ul><li><strong>作用</strong>:匹配前面的子表达式一次或多次(贪婪模式,尽可能多地匹配)。</li><li><strong>组合使用</strong>:当与<code>?</code>组合成<code>+?</code>时,表示非贪婪模式(尽可能少地匹配)。</li></ul>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/a+/', aaa));
</pre></div>
<ul><li><strong>有+时</strong>:可以匹配一个或多个连续的<code>a</code>,如<code>a</code>、<code>aa</code>、<code>aaa</code>等。</li><li><strong>无+时</strong>(例如<code>/a/</code>):只能匹配单个<code>a</code>,不能匹配多个。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>?的作用</h2>
<ul><li><strong>作用:</strong>
<ul><li>单独使用时:匹配前面的子表达式<strong>零次或一次</strong>(即前面的内容是可选的)。</li><li>紧跟在量词(如<code>*</code>、<code>+</code>、<code>?</code>、<code>{n}</code>等)后面时:将贪婪模式转换为非贪婪模式(最小匹配)。</li></ul></li></ul>
<p class="maodian"><a name="_lab2_3_0"></a></p><h3>情况1:单独使用</h3>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/a?b/', ab));
</pre></div>
<ul><li><strong>有?时</strong>:可以匹配<code>b</code>(因为<code>a</code>出现0次)或<code>ab</code>(<code>a</code>出现1次),但不能匹配<code>aab</code>。</li><li><strong>无?时</strong>(例如<code>/ab/</code>):只能匹配<code>ab</code>,不能匹配<code>b</code>。</li></ul>
<p class="maodian"><a name="_lab2_3_1"></a></p><h3>情况2:作为非贪婪修饰符(与量词组合)</h3>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/a+?b/', aab));
</pre></div>
<ul><li><strong>有?(非贪婪模式)时</strong>:在字符串<code>aaab</code>中,会匹配<code>aab</code>(因为<code>+?</code>会尽可能少地匹配,只匹配一个<code>a</code>,然后遇到<code>b</code>就停止)。</li><li><strong>无?(贪婪模式)时</strong>:在字符串<code>aaab</code>中,会匹配整个<code>aaab</code>(因为<code>+</code>会尽可能多地匹配)。</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>*的作用</h2>
<ul><li><strong>有\*</strong>: 允许前面的元素出现0次或多次。即该元素可以没有,也可以重复多次。</li><li><strong>无\*</strong>: 前面的元素必须恰好出现一次(如果没有其他量词修饰的话)。</li></ul>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/ab*c/', 'ac');    // 匹配 "ac"(b出现0次)
                                                           // 匹配 "abc"
                                                           // 匹配 "abbbbc"
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>^的作用</h2>
<p><strong>作用:</strong></p>
<ul><li>匹配字符串的<strong>开始位置</strong></li><li>在多行模式(<code>m</code> 修饰符)下也匹配<strong>每行的开头</strong></li></ul>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/^abc/', 'abc');   //匹配 "abc123"
                                                                //不匹配 "123abc"
</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>$的作用</h2>
<p><strong>作用</strong></p>
<ul><li>匹配字符串的<strong>结束位置</strong></li><li>在多行模式(<code>m</code> 修饰符)下也匹配<strong>每行的结尾</strong></li></ul>
<p>如:</p>
<div class="jb51code"><pre class="brush:php;">preg_match('/abc$/', 'abc');   //不匹配 "abc123"
                                                                //匹配 "123abc"
</pre></div>
<p class="maodian"><a name="_label7"></a></p><h2>综合对比表</h2>
<table><thead><tr><th>元字符</th><th>示例表达式</th><th>匹配行为</th><th>示例输入</th><th>匹配结果</th></tr></thead><tbody><tr><td><code>.</code></td><td><code>/a.b/</code></td><td>匹配任意单个字符(除换行符)</td><td><code>aXb</code></td><td>匹配<code>aXb</code></td></tr><tr><td>无<code>.</code></td><td><code>/ab/</code></td><td>只能匹配字面<code>ab</code></td><td><code>aXb</code></td><td>不匹配</td></tr><tr><td><code>+</code></td><td><code>/a+/</code></td><td>匹配1个或多个<code>a</code></td><td><code>aaa</code></td><td>匹配整个<code>aaa</code></td></tr><tr><td>无<code>+</code></td><td><code>/a/</code></td><td>只能匹配单个<code>a</code></td><td><code>aaa</code></td><td>只匹配第一个<code>a</code></td></tr><tr><td><code>?</code>(单独)</td><td><code>/a?b/</code></td><td><code>a</code>出现0次或1次</td><td><code>b</code></td><td>匹配<code>b</code></td></tr><tr><td>无<code>?</code></td><td><code>/ab/</code></td><td>只能匹配<code>ab</code></td><td><code>b</code></td><td>不匹配</td></tr><tr><td><code>+?</code></td><td><code>/a+?b/</code></td><td>非贪婪匹配:尽可能少地匹配<code>a</code></td><td><code>aaab</code></td><td>匹配<code>aab</code>(从第二个<code>a</code>开始)</td></tr><tr><td><code>+</code>(无<code>?</code>)</td><td><code>/a+b/</code></td><td>贪婪匹配:尽可能多地匹配<code>a</code></td><td><code>aaab</code></td><td>匹配整个<code>aa</code></td></tr><tr><td><code>^</code></td><td>/^a/</td><td>匹配出现在开头的<code>a</code></td><td>a</td><td>匹配到了开头的 <code>a</code></td></tr></tbody></table>
<p class="maodian"><a name="_label8"></a></p><h2>总结</h2>
<p>就是最近经常遇到一些这类的 <strong>特殊符号</strong>,搞不懂什么意思,网上也没有很全面的教程,就问al,自己总结了一下。</p>
頁: [1]
查看完整版本: 一文详解正则表达式中的特殊符号