我正在尝试创建一个匹配模式的正则表达式,但如果最后一组的长度不正好是 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})
意思是,在字符串中向后看并匹配以下内容,但不要将其添加到我的结果中(这称为积极向后看) - 也有相反的负面环视,但我会把它留给您去研究。