簡體   English   中英

為什么括號使我的正則表達式不匹配?

[英]Why do parentheses make my regex not match?

匹配:

Console.WriteLine(Regex.IsMatch("15, 17-19", @"^\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?(?:,\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?)*$"));

但是當我在^之后和$之前添加括號時它沒有

Console.WriteLine(Regex.IsMatch("15, 17-19", @"^(\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?(?:,\s*\d\d|\d\d\d\d\s*(?:-\s*\d\d|\d\d\d\d\s*)?)*)$"));

誰能告訴我為什么?

更新:

我現在看到我的原始表達是錯誤的。 我應該將我的\\d\\d|\\d\\d\\d\\d部分包含在非捕獲組中,如下所示:

^\s*(?:\d\d|\d\d\d\d)\s*(?:-\s*(?:\d\d|\d\d\d\d)\s*)?(?:,\s*(?:\d\d|\d\d\d\d)\s*(?:-\s*(?:\d\d|\d\d\d\d)\s*)?)*$

這也可以寫成

^\s*(?:\d{2}|\d{4})\s*(?:-\s*(?:\d{2}|\d{4})\s*)?(?:,\s*(?:\d{2}|\d{4})\s*(?:-\s*(?:\d{2}|\d{4})\s*)?)*$

這將允許我根據需要添加額外的括號而不改變行為。 謝謝。

表達式中有管道 - 它會在您添加括號時更改表達式的工作方式。

帶括號的第二個模式使^$元字符適用於整個模式,這意味着整個字符串必須與模式匹配。 換一種說法:

  • 匹配字符串的開頭( ^
  • 你的模式
  • 匹配字符串結尾( $

你的第一個模式正在傳遞,因為它實際上被解釋為^pattern1pattern2$ ,因此它部分匹配輸入而不是完全匹配。 這種模式的細分是:

  • 匹配字符串的開頭和第一個備用(從^到管道符號)
  • 或者匹配第二個備用字符串和字符串結尾(在管道符號之后直到$

暫無
暫無

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

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