如果某行有七個重複的東西,它也因此包含重複的那件事3-5,並在幾個點,不會少。
使用匹配錨如果你希望錨定匹配。否則,當然,他們不是。
/X{3,}/
/X{3,5}/
和之間的實際差別是多久一個它相匹配的字符串的 - 匹配的程度(或跨度)。如果你正在尋找的是一個布爾型的yes/no響應,並且在你的模式中沒有任何進一步的東西,它沒有什麼區別。實際上,如果知道這樣做是安全的,那麼適度聰明的正則表達式引擎會早點返回。看出差別
一種方法是使用GNU的grep的-o或--only匹配選項。觀察:
$ echo 123456789 | egrep -o '[0-9]{3}'
123
456
789
$ echo 123456789 | egrep -o '[0-9]{3,}'
123456789
$ echo 123456789 | egrep -o '[0-9]{3,5}'
12345
6789
$ echo 123456789 | egrep -o '[0-9]{3,5}[2468]'
123456
$ echo 123456790 | egrep -o '[0-9]{3,5}[13579]'
12345
6789
要理解最後兩個工作的方式,找到正則表達式引擎的嘗試(包括回溯步驟)很有用。您可以通過這種方式做到這一點使用Perl:
$ perl -Mre=debug -le 'print $& while 1234567890 =~ /\d{3,5}[13579]/g'
Compiling REx "\d{3,5}[13579]"
Final program:
1: CURLY {3,5} (4)
3: DIGIT (0)
4: ANYOF[13579][] (15)
15: END (0)
stclass DIGIT minlen 4
Matching REx "\d{3,5}[13579]" against "1234567890"
Matching stclass DIGIT against "1234567" (7 chars)
0 <> <1234567890> | 1:CURLY {3,5}(4)
DIGIT can match 5 times out of 5...
5 <12345> <67890> | 4: ANYOF[13579][](15)
failed...
4 <1234> <567890> | 4: ANYOF[13579][](15)
5 <12345> <67890> | 15: END(0)
Match successful!
12345
Matching REx "\d{3,5}[13579]" against "67890"
Matching stclass DIGIT against "67" (2 chars)
5 <12345> <67890> | 1:CURLY {3,5}(4)
DIGIT can match 5 times out of 5...
10 <1234567890> <> | 4: ANYOF[13579][](15)
failed...
9 <123456789> <0> | 4: ANYOF[13579][](15)
failed...
8 <12345678> <90> | 4: ANYOF[13579][](15)
9 <123456789> <0> | 15: END(0)
Match successful!
6789
Freeing REx: "\d{3,5}[13579]"
如果您有關於比賽結束後會發生什麼額外的限制,那麼哪種類型的重複,你可以選擇有很大的不同的。
$ perl -le 'print $& while 1234567890 =~ /\d{3}(?=[13579])/g'
234
678
$ perl -le 'print $& while 1234567890 =~ /\d{3,5}(?=[13579])/g'
1234
5678
% perl -le 'print $& while 1234567890 =~ /\d{3,}(?=[13579])/g'
12345678
所以當你有事情要來之後,它可以使一個巨大的:在這裏,我會說,它需要一個奇怪的數字之前結束強加在那裏每場比賽允許完成,約束差價交易。當你只是決定整條線路是否匹配時,可能並不重要。
這是我猜測的一個過於因此,如果它是預期的行爲的問題。」錨定有助於在某些情況下,但如果我的字符串不是結束‘PQ’更新我的問題上面 –
@Rajesh?更新回答以符合您更新的問題。希望這會有所幫助! – tchrist
哇!非常感謝您的詳細解釋。我將再次重溫該示例,因爲我試圖掌握正則表達式的工作原理。再次感謝:) –