2012-03-08 88 views
3

與有相似模式相匹配的字符串:正則表達式問號

-TEXT-someMore-String 

要獲得-TEXT-,我才知道,這個工程:

/-(.+?)-/ // -TEXT- 

由於我所知道的,?使得前面的令牌可選爲:

colou?rcolourcolor

比賽

我最初把在正則表達式來獲得-TEXT-部分是這樣的:

/-(.+)-/ 

但它給了-TEXT-someMore-

如何添加?停止正則表達式以正確獲取-TEXT-部件?既然它使前面的令牌可選不像上面的例子那樣在某個點停止?

回答

9

正如你所說,?有時意味着「零或一」,但在你的正則表達式中,+?是一個單位,意思是「一個或多個—,最好儘可能少」。 (這是相對於裸+,這意味着「一個或多個—和優選儘可能多的」。)

作爲the documentation所說:

然而,如果一個量詞後跟一個問題標記, 然後它變得懶惰,而是匹配最小 次數可能,所以模式/\*.*?\*/ 用C註釋做正確的事情。 各種量詞的含義沒有改變,只是首選的 匹配數量。不要混淆這個問號的使用和它自己作爲一個量詞的用法。 因爲它有兩個用途,它有時可能會加倍,因爲\d??\d中的 按首選項匹配一位數,但如果 是匹配模式的其餘部分匹配的唯一方式,則匹配兩位。

+6

是的。 '+'和'*'被稱爲「貪婪」的操作符:它們消耗的儘可能多,因爲它們可以逃脫。相反,'+?'和'*?'是「非貪婪」版本:它們消耗的儘可能少。在網絡上搜索「regex greedy nongreedy」獲取更多信息/教程。 – 2012-03-08 19:54:16

+0

@EdwardLoper這是一個恥辱,我不能收藏評論。我會將您的評論複製到.txt文件中:D – ajax333221 2012-03-08 21:50:18

2

?令牌是{0,1}的簡寫,意思是:0到1之間的任何東西出現都是最前面的。

+不是一個令牌,而是一個量詞。速記{1,}:1,直到無盡的外觀。

A?量詞將其設置爲非強制模式後。如果處於貪婪模式,則儘可能多地匹配字符串。如果不貪它匹配儘量少

3

或者,你可以使用ü ngreedy修改設置整個正則表達式搜索最好儘可能短的比賽:

/-(.+)-/U 
1

另一個,也許是您的正則表達式中的基本錯誤是您嘗試通過.+?匹配任意數量的字符。然而,你真正想要的可能是:「除了 - 之外的任何字符」。你可以通過[^-]+得到結果在這種情況下,如果你做了一個貪婪的匹配沒有關係 - 只要你在字符串中遇到第二個「 - 」,重複匹配就會終止。