为什么正则表达式没有按预期工作

本文关键字:工作 正则表达式 为什么 | 更新日期: 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"