簡體   English   中英

正則表達式以獲取C#中某個模式的所有可能匹配項

[英]Regex to get all possible matches for a pattern in C#

我正在學習正則表達式,需要從字符串中獲取模式的所有可能匹配項。

如果我的輸入是:

case a
when cond1 
then stmt1;
when cond2 
then stmt2;
end case;

我需要獲取具有以下分組的比賽

第一組:

  1. "cond1"
  2. "stmt1;"

和第2組:

  1. "cond2"
  2. "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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM