有一个字符串可以有一个或多个字符串范围。这些是正确的字符串:
""
"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 的答案略有补充。此正则表达式与“asd-asd;asd-asd;”不匹配 如果您使用的是 .Net 正则表达式库。但是如果你添加一个';' 作为字符串结束之前的选项,它将涵盖所有情况。
^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*);?$
现在这将匹配提供的所有有效字符串,除了 Invalid - "asd0-asd1-asd2"