为什么正则表达式不像预期的那样工作?

时间:2013-10-15 09:10:18

标签: c# regex

有一个字符串可以有一个或多个字符串范围。 这些是正确的字符串:

""
"asd-asd"
"asd-asd;asd-asd"
"asd-asd;asd-asd;"
"asd-asd;asd-asd;asd0-asd1"

但字符串"asd0-asd1-asd2"不应该有效。我写了以下正则表达式:

^(([^;-]+-[^;-]+);?)*$

它并没有像我预期的那样工作 - 这个正则表达式表明这个字符串是匹配的。为什么呢?

4 个答案:

答案 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”