<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## **正向零寬斷言** 用于**查找在某些內容(但并不包括這些內容)之前或之后的東西**,也就是說它們像\\b,^,$那樣用于指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧: (?=exp)也叫**零寬度正預測先行斷言**,它斷言自身出現的位置的后面能匹配表達式exp。比如\\b\\w+(?=ing\\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。 (?<=exp)也叫**零寬度正回顧后發斷言**,它斷言自身出現的位置的前面能匹配表達式exp。比如(?<=\\bre)\\w+\\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。 假如你想要給一個很長的數字中每三位間加一個逗號(當然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?<=\\D)\\D{3})+\\b,用它對xxxxxxxxxx進行查找時結果是xxxxxxxxx 下面這個例子同時使用了這兩種斷言:(?<=\\s)\\d+(?=\\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符) 斷言用來聲明一個應該為真的事實。正則表達式中只有當斷言為真時才會繼續進行匹配。 ## **負向零寬斷言** 如果我們只是想要確保某個字符沒有出現,但并不想去匹配它時怎么辦?例如,如果我們想查找這樣的單詞--它里面出現了字母q,但是q后面跟的不是字母u,我們可以嘗試這樣: \\b\\w\*q\[^u\]\\w\*\\b匹配包含后面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發現,如果q出現在單詞的結尾的話,像Iraq,Benq,這個表達式就會出錯。這是因為\[^u\]總要匹配一個字符,所以如果q是單詞的最后一個字符的話,后面的\[^u\]將會匹配q后面的單詞分隔符(可能是空格,或者是句號或其它的什么),后面的\\w\*\\b將會匹配下一個單詞,于是\\b\\w\*q\[^u\]\\w\*\\b就能匹配整個Iraq fighting。負向零寬斷言能解決這樣的問題,因為它只匹配一個位置,并不消費任何字符。,我們可以這樣來解決這個問題:\\b\\w\*q(?!u)\\w\*\\b。 零寬度負預測先行斷言(?!exp),斷言此位置的后面不能匹配表達式exp。例如:\\d{3}(?!\\d)匹配三位數字,而且這三位數字的后面不能是數字;\\b((?!abc)\\w)+\\b匹配不包含連續字符串abc的單詞。 同理,我們可以用(?<!exp),零寬度負回顧后發斷言來斷言此位置的前面不能匹配表達式exp:(?<!\[a-z\])\\d{7}匹配前面不是小寫字母的七位數字。 請詳細分析表達式(?).\*(?=),這個表達式最能表現零寬斷言的真正用途。 一個更復雜的例子:(?).\*(?=)匹配不包含屬性的簡單HTML標簽內里的內容。(?)指定了這樣的前綴:被尖括號括起來的單詞(比如可能是),然后是.\*(任意的字符串),最后是一個后綴(?=)。注意后綴里的\\/,它用到了前面提過的字符轉義,將”/“轉義;\\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\\w+)匹配的內容,這樣如果前綴實際上是的話,后綴就是了。整個表達式匹配的是和之間的內容(再次提醒,不包括前綴和后綴本身)。 (?:)(?=)(?!)(?<=)(?<!)(?i)??零寬斷言 可簡單理解斷言為條件 >[danger]注意斷言的pattern條件必須是固定的如例子所給,而不是(^>)*這種 <table class="table-view log-set-param"> <tbody> <tr> <td align="left" valign="middle" width="75"> <div class="para">?</div> </td> <td align="left" valign="middle" width="658"> <div class="para">當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”,“o+”將盡可能多的匹配“o”,得到結果[“oooo”],而“o+?”將盡可能少的匹配“o”,得到結果 ['o', 'o', 'o', 'o']</div> </td> </tr> <tr> <td align="left" valign="middle" width="75"> <div class="para">.點</div> </td> <td align="left" valign="middle" width="658"> <div class="para">匹配除“\r\n”之外的任何單個字符。要匹配包括“\r\n”在內的任何字符,請使用像“[\s\S]”的模式。</div> </td> </tr> <tr> <td align="left" valign="middle" width="75"> <div class="para">(pattern)</div> </td> <td align="left" valign="middle" width="658"> <div class="para">匹配pattern并獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“\(”或“\)”。</div> </td> </tr> <tr> <td align="left" valign="middle" width="75"> <div class="para">(?:pattern)</div> </td> <td align="left" valign="middle" width="658"> <div class="para">獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。<code> $subject="industry and industries !"; $pattern="/industr(?:y|ies)/"; $a=preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); dump($matches); 結果: array:1 [▼ 0 => array:2 [▼ 0 => array:2 [▼ 0 => "industry" 1 => 0 ] 1 => array:2 [▼ 0 => "industries" 1 => 13 ] ] ] </code> </div> </td> </tr> <tr> <td align="left" valign="middle" width="75"> <div class="para"><span style="color: #ff6600;"><span style="color: #808080;"><span style="background-color: #ffffff; color: #808000;">find</span>(</span>?=pattern)</span></div> </td> <td align="left" valign="middle" width="658"> <div class="para">(<strong>零寬度正預測先行斷言</strong>)<span style="color: #ff6600;">正向預搜索(匹配find右邊是pattern的find 即它斷言此位置的后面能匹配表達式pattern)</span>非獲取匹配,正向肯定預查,該匹配不需要獲取供以后使用。例如判斷Windows右側是否出現pattern出現則匹配,“<span style="color: #0000ff;">Windows(?=95|98|NT|2000)</span>”能匹配“Windows95、Windows98、Windows2000、WindowsNT”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。<br> <code> $str=" fgets() fgetss([\\\$allowable_tags ] )"; $pattern="/[\w]+(?=[(])/"; preg_match_all($pattern,$str ,$matches); </code> </div> </td> </tr> <tr> <td align="left" valign="middle" width="75"> <div class="para"><span style="color: #ff6600;"><span style="color: #808000;">find</span>(?!pattern)</span></div> </td> <td align="left" valign="middle" width="658"> <div class="para"> <p>(<strong>零寬度負預測先行斷言</strong>)<span style="color: #ff6600;">正向預搜索(匹配find右邊不是pattern的find)</span>非獲取匹配,正向否定預查,該匹配不需要獲取供以后使用。例如“<span style="color: #0000ff;">Windows(?!95|98|NT|2000)</span>”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。</p> <pre class="best-text mb-10">\b((?!abc)\w)+\b:匹配由字母或數字或下劃線或漢字組成的字串,但字串中不能出現abc</pre> </div> </td> </tr> <tr> <td align="left" valign="middle" width="75"> <div class="para"><span style="color: #ff6600;">(?&lt;=pattern)<span style="color: #808000;">find</span></span></div> </td> <td align="left" valign="middle" width="658"> <div class="para">(<strong>零寬度正回顧后發斷言</strong>)<span style="color: #ff6600;">反向預搜索(匹配find左邊是pattern的find)</span> 匹配pattern后面的位置&nbsp;&nbsp;非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?&lt;=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 例子:取出【】里的內容 <code> $strSubject = "abc【111】abc【222】abc【333】abc"; $strPattern = "/(?<=【)[^】]+/"; $arrMatches = []; preg_match_all($strPattern, $strSubject, $arrMatches); var_dump($arrMatches); </code> </div> </td> </tr> <tr> <td align="left" valign="middle" width="75"> <div class="para"><span style="color: #ff6600;">(?&lt;!pattern)<span style="color: #808000;">find</span></span></div> </td> <td align="left" valign="middle" width="658"> <div class="para">(<strong>零寬度負回顧后發斷言</strong>)&nbsp;<span style="color: #ff6600;">反向預搜索(匹配find左邊不是pattern的find)</span>&nbsp;匹配前面不是pattern的位置&nbsp; 非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反。例如“(?&lt;!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。這個地方不正確,有問題</div> <div class="para">此處用或任意一項都不能超過2位,如“(?&lt;!95|98|NT|20)Windows正確,“(?&lt;!95|980|NT|20)Windows 報錯,若是單獨使用則無限制,如(?&lt;!2000)Windows 正確匹配</div> </td> </tr> </tbody> </table> ## 環視 (?=pattern)與(?!pattern)屬于一類,在正則表達式中叫**環視**。 “環視”這個詞從字面理解就是確定“周圍環境”。 環視一共有四種:(?=pattern)、(?!pattern)、(?<=pattern)、(?<!pattern)。 前兩種是順序環視(lookahead),也叫做前瞻 (?=pattern)、(?!pattern) 后兩種叫逆序環視(look-behind),也叫后顧 (?<=pattern)、(?<!pattern) 每種又有“=”和“!”之分,前者是肯定(滿足pattern則匹配成功),后者是否定(不滿足pattern則匹配成功) 有一點需要注意:**逆向環視時,pattern長度必須是固定的**,也就是說pattern中不能出現諸如\*.等這類字符使得pattern匹配的長度不固定;但是前向環視沒有這個要求(只是某些語言逆向環視只支持固定長度而已 推薦《精通正則表達式》) 斷言的口訣: **前面有,正向后發(?<=exp),放前面;** **后面有(pattern),正向先行(?=exp),(pattern)放后面;** **前面無,反向后發(?<!exp),放前面;** **后面無,反向先行(?!exp),放后面。** 這個前面和后面是**針對目標字符串** python例子 ~~~ import re pattern = re.compile(r'(?<=<([a-zA-Z]+>)).*(?=</\1>)') s = '<html>hello world</html>' ret = re.search(pattern, s) print(ret.group()) #得到結果: #Traceback (most recent call last): # raise error("look-behind requires fixed-width pattern") #sre_constants.error: look-behind requires fixed-width pattern #python的re模塊并不支持變長的后發斷言,只支持定長的后發斷言 #我們可以用分組來提取特定的字符串,上面代碼給了.*增加了一個分組,按從左到右是第二個分組,這樣我們可以在匹配結果中用.group(2)得到目標字符串 import re pattern = re.compile(r'<([a-zA-Z]+)>(.*)</\1>') s = '<html>hello world</html>' ret = re.search(pattern, s) print('re.group()→', ret.group()) print('re.group(2)→', ret.group(2)) #運行結果 #re.group()→ <html>hello world</html> #re.group(2)→ hello world ~~~ ``` #res=re.findall(r"(?<=define\([\'\"])\w+",fp.read()) #常量 #res=re.findall(r"\n[\s\;]*function[\s]+(([\w]+)[\s]*\(.*\))",fp.read())#函數 #res=re.findall(r"(?:public[\s]+function[\s]+|private[\s]+function[\s]+|protected[\s]+function[\s]+)(([\w]+)[\s]*\(.*\))",fp.read()) #類方法 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看