[英]Regex to get all possible matches for a pattern in C#
我正在學習正則表達式,需要從字符串中獲取模式的所有可能匹配項。
如果我的輸入是:
case a
when cond1
then stmt1;
when cond2
then stmt2;
end case;
我需要獲取具有以下分組的比賽
第一組:
"cond1"
"stmt1;"
和第2組:
"cond2"
"stmt2;"
是否可以使用任何正則表達式來獲得這樣的組?
如果您不嵌套語句,則可以為此使用正則表達式。 例如,如果您的stmt1是另一種情況陳述,那么所有下注都將關閉(您不能將regex用於此類操作,需要常規解析器)。
編輯 :如果您真的想嘗試一下,可以使用類似的方法(未經測試,但是您知道了):
Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?;)", RegexOptions.Singleline)
allMatches = t.Matches(input_string)
但是正如我所說,這僅適用於非嵌套語句。
編輯2 :稍微更改了正則表達式以將分號包括在最后一組中。 這將無法按您希望的方式工作-相反,它將為您提供多個匹配項,並且每個匹配項將在條件時表示一個匹配項,其中第一組為條件,第二組為語句。
我不認為您可以構建能完全滿足您需要的正則表達式,但這應該足夠接近(我希望)。
編輯3 :新的正則表達式-應該處理多個語句
Regex t = new Regex(@"when\s+(.*?)\s+then\s+(.*?)(?=(when|end))", RegexOptions.Singleline)
它包含一個正向的前瞻,因此第二組從那時開始匹配到下一個“何時”或“結束”。 在我的測試中,它可以這樣工作:
case a
when cond1
then stmt1;
stm1;
stm2;stm3
when cond2
then stmt2;
aaa;
bbb;
end case;
目前它是區分大小寫的,因此,如果需要區分大小寫,則需要添加相應的regex標志。
我認為這是不可能的,主要是因為任何匹配的組在...然后...時都將匹配所有組,從而在同一組內創建多個捕獲。
我建議使用此正則表達式:
(?:when(.*)\nthen(.*)\n)+?
結果是:
比賽1:
*第1組:cond1
*第2組:stmt1;
比賽2:
*第1組:cond2
*第2組:stmt2;
如果是用Java編寫的,我將為解析器編寫兩種模式,一種用於匹配大小寫,而另一種則用於匹配when-then情況。 后者的寫法如下:
CharSequence buffer = inputString.subSequence(0, inputString.length());
// inputString is the string you get after matching the case statements...
Pattern pattern = Pattern.compile(
"when (\\S+).*"
+ "then (\\S+).*");
Matcher matcher = pattern.matcher(buffer);
while (matcher.find()) {
DoWhenThen(matcher.group(1), matcher.group(2));
}
注意:我尚未測試此代碼,因為我不確定100%是否在模式上...但是我會對此進行修補。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.