2012-05-28 59 views
0

我有以下的文本字符串和正則表達式模式在AC程序:的Posix正則表達式捕獲組匹配序列

char text[] = "  identification  division. "; 
char pattern[] = "^(.*)(identification *division)(.*)$"; 

使用regexec()庫函數,我得到了以下結果:

 
String:   identification  division. 
Pattern: ^(.*)(identification *division)(.*)$ 
Total number of subexpressions: 3 

OK, pattern has matched ... 

begin: 0, end: 37,match:   identification  division. 
subexpression 1 begin: 0, end: 8, match: 
subexpression 2 begin: 8, end: 35, match: identification  division 
subexpression 3 begin: 35, end: 37, match: . 

我因爲正則表達式引擎以貪婪的方式匹配,並且第一個捕獲組(。*)匹配任意數量的字符(除了新行字符),爲什麼它不匹配字符一直到文本字符串的末尾(up到'。')反對只匹配前8個空格?

是否每個捕獲組都將被匹配?

是否有在捕獲組如何文本字符串匹配任何規則?

謝謝。

+0

正則表達式不貪心;誰告訴你的? –

回答

0

正如你所說,如果貪心組(。*)消耗了整個字符串,正則表達式的其餘部分將沒有什麼可以匹配這會不會讓你的正則表達式匹配的字符串。所以,是的,每個捕獲組(和其他模式部分)需要匹配。這正是你在正則表達式中指定的內容。

試試下面的字符串,而不是和一個帶不願意和貪婪的第一組運行代碼,你會看到其中的差別。

char text[] = " identification division identification  division. "; 
+0

我明白你的觀點。當我嘗試使用文本字符串時,第一個捕獲組(。*)會在第二個「識別」之前將文本與之匹配。所以我現在清楚,每個捕獲組需要匹配,除非它是可選的。如果我將模式更改爲char pattern [] =「^(。*)(identification * division)?(。*)$」;那麼第一個捕獲組將匹配文本直到最後。謝謝。 – itnovice

1

正則表達式儘可能貪婪,而不太貪婪。如果左派團隊像你期望的那樣貪婪,那麼匹配「識別部門」的團隊將無法匹配,勉強拒絕text,這顯然是語言。