2010-07-19 42 views
0

我有一個字符串,它看起來像:如何在任意索引處選擇正則表達式匹配?

ABC-DEF01-GHI54677-JKL 9988-MNOP

每個-之間實際上可以是任何字符重複任意次數。

我使用正則表達式:

[^-]* 

如何讓「匹配」比賽第二指數(例如DEF01)在哪裏?或第三(GHI54677)或第四(JKL!9988)?

我使用的是沒有讓我指定匹配指數或其他代碼的引擎 - 它所有的表達中完成。

回答

2

第二組括號將捕獲「DEF」,「GHI」和「JKL」,分別...

([^-]+-){1}([^-]+) 
([^-]+-){2}([^-]+) 
([^-]+-){3}([^-]+) 

如果這是Perl中,使第一套括號非捕獲的,即:

# perl -de 0 
$_="ABC-DEF-GHI-JKL-MNO" 
p /(?:[^-]+-){1}([^-]+)/ 
    DEF 
p /(?:[^-]+-){2}([^-]+)/ 
    GHI 
p /(?:[^-]+-){3}([^-]+)/ 
    JKL 

$_="ABC-DEF01-GHI54677-JKL!9988-MNOP" 
p /(?:[^-]+-){1}([^-]+)/ 
    DEF01 
p /(?:[^-]+-){2}([^-]+)/ 
    GHI54677 
p /(?:[^-]+-){3}([^-]+)/ 
    JKL!9988 

說明:

(?: = non-capturing parens 
[^-] = a non-dash character 
+ = one or more 
- = a dash 
) = close paren 
{3} = repeat 3 times 

這部分 「吃掉」 1,2,3,或任何數量的你喜歡,塊的,要走g下一組將採取你正在尋找的一個。

代替+,您還可以使用{1,}表示1對任意數字。

如果你的塊可以是大小爲零,所以:

ABC - GHI-JKL

而且要找到第二個,這是 「」(空字符串),然後用*代替+。或者您可以使用{0,},意思是0到任意數字。

+0

這個回答我的問題,但後來我意識到自己錯誤地寫它。我的道歉,現在已經澄清。 – 2010-07-19 03:57:32

+0

沒問題,如果你的意思是一個或多個非破折號的事物,或者是'*'或'{0,}',那麼只需將'{3}'換成'+'或'{1,}'意思是零個或多個 – eruciform 2010-07-19 04:02:38

+0

答案更新... – eruciform 2010-07-19 04:19:04

1

你沒有指定你使用什麼語言/正則表達式引擎,但某些(大多數?)讓你不斷重複一遍又一遍應用匹配相同的字符串。例如,pcrecpp讓你做:

pcrecpp::StringPiece piece("ABC-DEF-GHI-JKL-MNO"); 
pcrecpp::RE re("([^-]+)-?"); 
unsigned int index = 3; // e.g., for GHI 

std::string group; 
for(unsigned int i = 0; i < index; i++) 
    re.Consume(&piece, &group); 

// group now contains "GHI". Calling Consume again would give it JKL 
+0

謝謝,不幸的是我不能使用任何額外的代碼 - 這一切都必須在表達式內完成。我現在澄清了這個問題。 – 2010-07-19 03:58:33

0

根據你的修訂不同的答案:你只是想要這樣嗎?

(?:[^-]+-){index-1}([^-]+) 

非捕獲組相匹配的子塊的index-1,所以index=3它匹配ABC-DEF01-,然後捕獲小組賽GHI54677

相關問題