只有当最后一个分组正好为n个字符时,正则表达式才匹配。

3

我正在尝试创建一个正则表达式来匹配一个模式,但如果最后一组不恰好是4个字符长,则不匹配。

示例:
正则表达式:(.{1,}-)(.{1,}-)(.{1,}-)(\d{4,4})
好的输入:A-AAAA-A-0001
坏的输入:A-AAAA-A-00011

我的正则表达式失败了,它从两个输入中都匹配到了A-AAAA-A-0001

3个回答

3
以下正则表达式将从字符串中捕获匹配项(即查找匹配的子字符串):
(?<=\s|^)([^\s]+-){3}(\d{4})(?=\s|$)

以下内容仅会匹配整个字符串:
^([^\s]+-){3}(\d{4})$

我稍微简化了您的正则表达式,但假设您没有为每组字符使用某些内容。

我修改了您的:

(.{1,}-)(.{1,}-)(.{1,}-)

Into

([^\s]+-){3}

这段话的意思是“匹配任何不是空格并以破折号结尾恰好3次的内容。'+'运算符是缩写,表示至少出现一次。”

我们能更具体一些吗?

我猜你可能只想匹配字母数字值。例如,$-A%^A-@-0001可能不是你想要匹配的有效内容。如果我对此正确,你需要使用简写字符类,这将使你的正则表达式看起来像这样(我假设你的正则表达式区分大小写):

匹配子字符串:

(?<=\s|^)([A-Za-z\d]+-){3}(\d{4})(?=\s|$)

匹配整个字符串:

^([A-Za-z\d]+-){3}(\d{4})$

一些指针:

  • 不要使用{4,4}来表示“恰好4次”,只需使用{4}
  • 不要使用{1,}来表示“1次或多次”,只需使用+
  • (?={regex in here}) 的意思是,在字符串中向前查找并匹配接下来的内容,但不要将其添加到我的结果中(这被称为正向先行断言)
  • (?<={regex in here}) 的意思是,在字符串中向后查找并匹配接下来的内容,但不要将其添加到我的结果中(这被称为正向后行断言)
  • 还有负面的环视,它们的作用相反,但我会让你自己去研究。

如果你对正则表达式很感兴趣,就像我一样,你可能想了解一个叫做RegexBuddy的应用程序。它非常适合从初学者到专家的人使用。你可以插入测试数据并编写你的正则表达式,实时查看匹配结果。它还有非常好的上下文帮助、可视化的正则表达式构建器,可以将正则表达式解码为普通英语,并且还可以将你完成的正则表达式导出到任何数量的编程语言中(如果你在使用不支持的内容,它也会警告你)。我与制造商没有任何关联,只是喜欢这个产品。 - Iain Fraser

2

1

首先,我建议您简化一下您的正则表达式。我的建议是:

(\w+-){3}(\d{4})

既然您有3组单词字符后跟一个-符号,这就很简单了。

现在,为了仅捕获那些期望的匹配项,如果您正在测试这些字符串,您只需要添加^$定界符。

^(\w+-){3}(\d{4})$

请点击 此链接 查看其运行情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接