參考亨利斯賓塞正規表達庫我想知道(.+_)*
和(.)*
之間的區別。使用Henry Spencer正則表達式庫時,(。+ _)*是什麼意思?
(.+_)*
試圖將字符串從後面還有匹配。根據我的理解,.
匹配任何單個字符,.+
將表示該字符的非零次出現。 _
將表示空格或{或}等。
括號暗示任何一個可以被認爲是匹配,並且最終*
表示0或更多次出現。
我覺得(.)*
也會達到同樣的效果。 .
之後的+
可能是多餘的。
有人能解釋我兩者之間的細微差別嗎?
參考亨利斯賓塞正規表達庫我想知道(.+_)*
和(.)*
之間的區別。使用Henry Spencer正則表達式庫時,(。+ _)*是什麼意思?
(.+_)*
試圖將字符串從後面還有匹配。根據我的理解,.
匹配任何單個字符,.+
將表示該字符的非零次出現。 _
將表示空格或{或}等。
括號暗示任何一個可以被認爲是匹配,並且最終*
表示0或更多次出現。
我覺得(.)*
也會達到同樣的效果。 .
之後的+
可能是多餘的。
有人能解釋我兩者之間的細微差別嗎?
例如,aa aa
將與(.+_)*
匹配,但不會由(._)*
匹配,因爲後者只在空格前面有一個字符。
我不記得下劃線有什麼特別的含義。關於Henry Spencer正則表達式庫的特別之處在於它結合了兩個正則引擎技術 - 確定性和非確定性。
這有一個親和騙子。
親是你的正則表達式將是最快的,只是建立,而在其他引擎,你可能會使用看起來頭和先進的正則表達式技術(如使它失敗,如果沒有匹配提前),以實現相同速度。
這意味着整個正則表達式將是貪婪或不貪婪。也就是說,如果你使用*或+ withouth後面的a,那麼整個正則表達式會很貪婪,即使你使用?之後。如果你第一次使用*或+,你按照它來做,那麼整個正則表達式將不會非常貪婪。
這使得略微更巧妙地制定的正則表達式,但真的稍微。
Henry Speced庫是tcl的regexp
命令的後面的引擎,它使得該語言對於正則表達式非常有效。
據我所知_
沒有特別的意義,它只是一個「_」。見regular-expressions.info
您的兩個正則表達式是不一樣的。
(._)*
將匹配一個字符跟一個下劃線(如果下劃線在你執行一個特殊的意義替換「強調」由意),這個序列將被匹配0次或更多次,例如「a_%_._?_
」
(.+_)*
將匹配至少一個字符後跟下劃線,該序列將被匹配0次或多次,例如「abc45_%_.;,:_?#'+*~_
」
(.+_)*
將匹配可以通過(._)*
匹配的一切,但不能反過來。
謝謝。我知道了。我編輯了這個問題以找出(。+ _)*和(。)*之間的區別。我無法想到任何與前者相匹配但不是後者的字符串,甚至反之亦然。 – user1912491
我認爲你應該閱讀一個基本的正則表達式教程。括號僅用於分組(和捕獲)。所以第二個表達式中的括號是無用的,除非你想捕獲最後匹配的字符。第二個匹配每個字符串(直到第一個換行符)。第一個在最後需要一個空格字符。 – stema
謝謝。我知道了。如果它是(。+ _)* Vs(。)*,會有什麼區別。 aa aa也會與(。)*匹配。會不會有前者匹配的琴絃,而不是後者?或者是否會有與後者匹配的任何字符串,但不會由前者匹配? – user1912491
'(。)*'將匹配所有內容,該點代表每個可能的字符,所以沒有匹配前者的字符串,並且不匹配這個正則表達式。任何不包含空格的內容都將被後者匹配,但不會被前者匹配。 – alestanis