为什么正则表达式没有按预期工作
本文关键字:工作 正则表达式 为什么 | 更新日期: 2023-09-27 18:35:36
有一个字符串可以有一个或多个字符串范围。这些是正确的字符串:
""
"asd-asd"
"asd-asd;asd-asd"
"asd-asd;asd-asd;"
"asd-asd;asd-asd;asd0-asd1"
但是字符串"asd0-asd1-asd2"
不应该有效。我写了下面的正则表达式:
^(([^;-]+-[^;-]+);?)*$
而且它没有像我预期的那样工作 - 这个正则表达式显示这个字符串是匹配的。为什么?
你需要让你的正则表达式稍微复杂一点:
^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*)?$
解释:
^ # Start of the string
( # Start of first group:
[^;-]+-[^;-]+ # Match one "asd-asd"
( # Start of second group
; # Match ;
[^;-]+-[^;-]+ # Match another "asd-asd"
)* # Repeat the second group any number of times (including zero)
)? # Make the entire first group optional
$ # End of string
它匹配是因为 ;? 这使得 ; 可选。您正在尝试使用上下文测试某些内容,正则表达式不是最简单的工具。
为了避免使分号成为可选,您可以使用 (;|$)。
这将强制匹配分号,除非您位于字符串的末尾。
^(([^;-]+-[^;-]+)(;|$))*$
@Tim的答案略有增加。如果您使用的是 .Net 正则表达式库,则此正则表达式与"asd-asd;asd-asd;"不匹配。但是,如果您在字符串结束之前添加";"作为选项,那么它将涵盖所有情况。
^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*);?$
现在,这将匹配提供的所有有效字符串,但无效 - "asd0-asd1-asd2"