2012-12-18 23 views
1

參考亨利斯賓塞正規表達庫我想知道(.+_)*(.)*之間的區別。使用Henry Spencer正則表達式庫時,(。+ _)*是什麼意思?

(.+_)*試圖將字符串從後面還有匹配。根據我的理解,.匹配任何單個字符,.+將表示該字符的非零次出現。 _將表示空格或{或}等。

括號暗示任何一個可以被認爲是匹配,並且最終*表示0或更多次出現。

我覺得(.)*也會達到同樣的效果。 .之後的+可能是多餘的。

有人能解釋我兩者之間的細微差別嗎?

回答

2

例如,aa aa將與(.+_)*匹配,但不會由(._)*匹配,因爲後者只在空格前面有一個字符。

+0

謝謝。我知道了。如果它是(。+ _)* Vs(。)*,會有什麼區別。 aa aa也會與(。)*匹配。會不會有前者匹配的琴絃,而不是後者?或者是否會有與後者匹配的任何字符串,但不會由前者匹配? – user1912491

+0

'(。)*'將匹配所有內容,該點代表每個可能的字符,所以沒有匹配前者的字符串,並且不匹配這個正則表達式。任何不包含空格的內容都將被後者匹配,但不會被前者匹配。 – alestanis

2

我不記得下劃線有什麼特別的含義。關於Henry Spencer正則表達式庫的特別之處在於它結合了兩個正則引擎技術 - 確定性和非確定性。

這有一個親和騙子。

親是你的正則表達式將是最快的,只是建立,而在其他引擎,你可能會使用看起來頭和先進的正則表達式技術(如使它失敗,如果沒有匹配提前),以實現相同速度。

這意味着整個正則表達式將是貪婪或不貪婪。也就是說,如果你使用*或+ withouth後面的a,那麼整個正則表達式會很貪婪,即使你使用?之後。如果你第一次使用*或+,你按照它來做,那麼整個正則表達式將不會非常貪婪。

這使得略微更巧妙地制定的正則表達式,但真的稍微。

Henry Speced庫是tclregexp命令的後面的引擎,它使得該語言對於正則表達式非常有效。

1

據我所知_沒有特別的意義,它只是一個「_」。見regular-expressions.info

您的兩個正則表達式是不一樣的。

  1. (._)*將匹配一個字符跟一個下劃線(如果下劃線在你執行一個特殊的意義替換「強調」由意),這個序列將被匹配0次或更多次,例如「a_%_._?_

  2. (.+_)*將匹配至少一個字符後跟下劃線,該序列將被匹配0次或多次,例如「abc45_%_.;,:_?#'+*~_

(.+_)*將匹配可以通過(._)*匹配的一切,但不能反過來。

+0

謝謝。我知道了。我編輯了這個問題以找出(。+ _)*和(。)*之間的區別。我無法想到任何與前者相匹配但不是後者的字符串,甚至反之亦然。 – user1912491

+0

我認爲你應該閱讀一個基本的正則表達式教程。括號僅用於分組(和捕獲)。所以第二個表達式中的括號是無用的,除非你想捕獲最後匹配的字符。第二個匹配每個字符串(直到第一個換行符)。第一個在最後需要一個空格字符。 – stema

相關問題