我正在尝试创建一个匹配模式的正则表达式,但如果最后一组的长度不正好是 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,}-) 

进入

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

表示“匹配任何非空格且以破折号结尾的内容正好匹配 3 次。‘+’运算符是表示 {1,] 或“至少一次”的简写。

我们可以更具体一点吗?

我怀疑您可能只想匹配字母数字值。例如,我怀疑 $-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})意思是,在字符串中向后看并匹配以下内容,但不要将其添加到我的结果中(这称为积极向后看)
  • 也有相反的负面环视,但我会把它留给您去研究。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!