有一个字符串可以有一个或多个字符串范围。 这些是正确的字符串:
""
"asd-asd"
"asd-asd;asd-asd"
"asd-asd;asd-asd;"
"asd-asd;asd-asd;asd0-asd1"
但字符串"asd0-asd1-asd2"
不应该有效。我写了以下正则表达式:
^(([^;-]+-[^;-]+);?)*$
它并没有像我预期的那样工作 - 这个正则表达式表明这个字符串是匹配的。为什么呢?
答案 0 :(得分:4)
你需要让正则表达式更复杂一些:
^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*)?$
<强>说明:强>
^ # 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
答案 1 :(得分:1)
因为匹配而匹配?这使得;可选的。您正在尝试使用上下文测试某些内容,正则表达式并不是最简单的工具。
答案 2 :(得分:1)
为避免使分号成为可选,您可以使用(; | $) 除非你在字符串的末尾,否则这将强制分号匹配。
^(([^;-]+-[^;-]+)(;|$))*$
答案 3 :(得分:0)
@Tim的答案略有添加。这个正则表达式不匹配“asd-asd; asd-asd;”如果您正在使用.Net正则表达式库。但是,如果你添加';'作为字符串结束之前的选项,它将涵盖所有情况。
^([^;-]+-[^;-]+(;[^;-]+-[^;-]+)*);?$
现在这将匹配除Invalid以外提供的所有有效字符串 - “asd0-asd1-asd2”