簡體   English   中英

C#中奇怪的Regex行為

[英]Weird Regex behavior in C#

我正在嘗試使用正則表達式從C#中的較長單詞中提取一些字母數字表達式。 例如,我有單詞“ FooNo12Bee”。 我使用以下正則表達式代碼,返回兩個匹配結果“ No12”和“ No”作為結果:

alfaNumericWord = "FooNo12Bee";
Match m = Regex.Match(alfaNumericWord, @"(No|Num)\d{1,3}");

如果我使用以下表達式,但不帶括號,並且沒有“ No”的替代選項,它會按我期望的方式工作,則僅返回“ No12”:

alfaNumericWord = "FooNo12Bee";
Match m = Regex.Match(alfaNumericWord, @"No\d{1,3}");

這兩個表達式之間有什么區別,為什么使用括號表示“否”會導致多余的結果?

正則表達式中的括號是捕獲組;正則表達式中的括號是捕獲組。 這意味着將捕獲在paren之間的內容並將其存儲為捕獲組。

如果您不想使用捕獲組,但仍需要一個組來進行輪換,請改用非捕獲組。 通過把?:第一個括號后:

Match m = Regex.Match(alfaNumericWord, @"(?:No|Num)\d{1,3}");

通常,如果由於某種原因不想更改正則表達式,則可以簡單地從匹配項中檢索組0,以僅獲取整個匹配項(從而忽略任何捕獲組)。 在您的情況下,請使用m.Groups[0].Value

最后,您可以通過以下方式使用一個槽口來提高正則表達式的效率:

Match m = Regex.Match(alfaNumericWord, @"N(?:o|um)\d{1,3}");

我無法解釋他們如何稱呼它,但這是因為在它周圍加上括號會創建一個新的組。 它很好地解釋這里

除了將正則表達式的一部分分組在一起,括號還創建了一個編號捕獲組。 它將與正則表達式部分匹配的字符串部分存儲在括號內。

正則表達式集(值)? 與Set或SetValue匹配。 在第一種情況下,第一個(也是唯一的)捕獲組保持為空。 在第二種情況下,第一個捕獲組匹配Value。

這是因為括號正在創建一個組。 您可以使用?:刪除該組?:就像Regex.Match(alfaNumericWord, @"(?:No|Num)\\d{1,3}");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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