2011-03-21 67 views
9

以下的正則表達式匹配「星期六」或「星期日」:(?:(Sat)ur|(Sun))day在C#中的php(pcre)中找到的分支重置運算符(「?|」)是什麼?

但是在一種情況下而反向引用2是空的,在另一種情況下,反之亦然引用1被填充。

PHP(pcre)提供了一個很好的運算符「?|」這繞開了這個問題。以前的正則表達式將變成(?|(Sat)ur|(Sun))day。所以不會有空的反向引用。

在C#中還是有一個等價的方法或一些解決方法?

+2

您可以使用'(?:(星期六(?= ur)| Sun(?!ur))(?:你)?)day'代替。 :) – Gumbo 2011-03-21 12:58:19

+0

@Gumbo爲什麼Sun沒有跟隨「你」?正則表達式有點複雜... – Stephan 2011-03-21 13:16:24

+0

否則,'Sunurday'可以匹配。這有點像我犯的錯誤(其中_you_指出:) :) – 2011-03-21 13:18:09

回答

12

.NET不支持分支重置操作符,但支持命名組,它可以讓您無限制地重複使用組名稱(AFAIK沒有其他功能)。所以,你可以這樣做:

(?:(?<abbr>Sat)ur|(?<abbr>Sun))day 

...和縮寫名稱將被存儲在Match.Groups["abbr"]

+0

是的,這是要走的路(如果是正則表達式)。整齊。 – 2011-03-21 13:16:53

+0

這是一個聰明的迴應。 – Stephan 2011-03-21 13:22:51

+1

Perl允許您以相同模式重用命名組。沒有限制。這也可以讓你找回匹配的命名組列表。 – tchrist 2011-04-28 01:17:38

3

應該可以連接backref1和backref2。
由於每個之一始終是空的,空一個字符串連接仍然是相同的字符串...

與您正則表達式(?:(Sat)ur|(Sun))day和更換$1$2
SatSaturdaySunSunday

 
regex (?:(Sat)ur|(Sun))day 
input | backref1 _$1_ | backref2 _$2_ | 'concat' _$1$2_ 
---------|---------------|---------------|---------------- 
Saturday | 'Sat'   | ''   | 'Sat'+'' = Sat 
Sunday | ''   | 'Sun'   | ''+'Sun' = Sun 

而不是閱讀backref1或backref2只是讀取結果和concat結果。

+0

我寧願直接在輸入字符串沒有任何操作(如分支重置運算符)的結果。 – Stephan 2011-03-21 13:24:08

+0

@Stephan我不明白你的評論?我不認爲我對輸入字符串進行了操作。我只是指出,你可以從正則表達式結果中對group1和group2進行連接,而對正則表達式沒有任何改變。 – 2011-03-21 13:32:20

+0

@bw_üezi您可以使用詳細的示例代碼編輯您的答案,因爲我仍然不理解您的解決方案。 – Stephan 2011-03-21 14:33:33

0

可以使用分支復位操作:

(?|foo(bar)|still(life)|(like)so) 

這將只設置一組無論哪個分支匹配。

+0

在這裏,我認爲StackOverflow是尋找質量的地方,而不是答案中的數量。 – ensisNoctis 2017-12-20 07:07:29