我正在尝试创建一个正则表达式来匹配一个模式,但如果最后一组不恰好是4个字符长,则不匹配。
示例:
正则表达式:(.{1,}-)(.{1,}-)(.{1,}-)(\d{4,4})
好的输入:A-AAAA-A-0001
坏的输入:A-AAAA-A-00011
我的正则表达式失败了,它从两个输入中都匹配到了A-AAAA-A-0001
(?<=\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})
的意思是,在字符串中向后查找并匹配接下来的内容,但不要将其添加到我的结果中(这被称为正向后行断言)对于正则表达式,使用^
和$
分别表示字符串的开头和结尾。
如果不是整个字符串,则可以使用负向前瞻断言(?!\d)
参考资料:
首先,我建议您简化一下您的正则表达式。我的建议是:
(\w+-){3}(\d{4})
既然您有3组单词字符后跟一个-
符号,这就很简单了。
现在,为了仅捕获那些期望的匹配项,如果您正在测试这些字符串,您只需要添加^
和$
定界符。
^(\w+-){3}(\d{4})$