我有一個字符串,它看起來像:如何在任意索引處選擇正則表達式匹配?
ABC-DEF01-GHI54677-JKL 9988-MNOP
每個-
之間實際上可以是任何字符重複任意次數。
我使用正則表達式:
[^-]*
如何讓「匹配」比賽第二指數(例如DEF01)在哪裏?或第三(GHI54677)或第四(JKL!9988)?
我使用的是沒有讓我指定匹配指數或其他代碼的引擎 - 它所有的表達中完成。
我有一個字符串,它看起來像:如何在任意索引處選擇正則表達式匹配?
ABC-DEF01-GHI54677-JKL 9988-MNOP
每個-
之間實際上可以是任何字符重複任意次數。
我使用正則表達式:
[^-]*
如何讓「匹配」比賽第二指數(例如DEF01)在哪裏?或第三(GHI54677)或第四(JKL!9988)?
我使用的是沒有讓我指定匹配指數或其他代碼的引擎 - 它所有的表達中完成。
第二組括號將捕獲「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到任意數字。
你沒有指定你使用什麼語言/正則表達式引擎,但某些(大多數?)讓你不斷重複一遍又一遍應用匹配相同的字符串。例如,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
謝謝,不幸的是我不能使用任何額外的代碼 - 這一切都必須在表達式內完成。我現在澄清了這個問題。 – 2010-07-19 03:58:33
根據你的修訂不同的答案:你只是想要這樣嗎?
(?:[^-]+-){index-1}([^-]+)
非捕獲組相匹配的子塊的index-1
,所以index=3
它匹配ABC-DEF01-
,然後捕獲小組賽GHI54677
這個回答我的問題,但後來我意識到自己錯誤地寫它。我的道歉,現在已經澄清。 – 2010-07-19 03:57:32
沒問題,如果你的意思是一個或多個非破折號的事物,或者是'*'或'{0,}',那麼只需將'{3}'換成'+'或'{1,}'意思是零個或多個 – eruciform 2010-07-19 04:02:38
答案更新... – eruciform 2010-07-19 04:19:04