[英]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*)?)*$
這將允許我根據需要添加額外的括號而不改變行為。 謝謝。
表達式中有管道 - 它會在您添加括號時更改表達式的工作方式。
帶括號的第二個模式使^
和$
元字符適用於整個模式,這意味着整個字符串必須與模式匹配。 換一種說法:
^
) $
) 你的第一個模式正在傳遞,因為它實際上被解釋為^pattern1
或pattern2$
,因此它部分匹配輸入而不是完全匹配。 這種模式的細分是:
^
到管道符號) $
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.