1

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

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

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

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

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

4

4 回答 4

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
于 2013-10-15T09:18:49.450 回答
1

它匹配是因为 ;? 这使得 ; 可选的。您正在尝试使用上下文测试某些内容,正则表达式并不是执行此操作的最简单工具。

于 2013-10-15T09:13:35.367 回答
1

为了避免使分号成为可选,您可以使用 (;|$)。
这将强制匹配分号,除非您位于字符串的末尾。

^(([^;-]+-[^;-]+)(;|$))*$
于 2013-10-15T09:16:05.213 回答
0

@Tim 的答案略有补充。此正则表达式与“asd-asd;asd-asd;”不匹配 如果您使用的是 .Net 正则表达式库。但是如果你添加一个';' 作为字符串结束之前的选项,它将涵盖所有情况。

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

现在这将匹配提供的所有有效字符串,除了 Invalid - "asd0-asd1-asd2"

于 2013-10-15T09:55:21.357 回答