仅当最后一组正好是n个字符时才使用正则表达式匹配

时间:2014-01-22 02:09:04

标签: .net regex

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

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

我的正则表达式失败,它从两个输入中选取A-AAAA-A-0001

3 个答案:

答案 0 :(得分:3)

以下正则表达式将从字符串内部拾取匹配项(即它将找到匹配的子字符串):

(?<=\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})表示在字符串中向后看并匹配以下内容,但不要将其添加到我的结果中(它称为正向后看)
  • 也有相反的负面看法,但我会留给你研究。

答案 1 :(得分:2)

使用^$将正则表达式固定为字符串的开头和结尾。

如果它不是整个字符串那么负面前瞻断言会帮助你(?!\d)

参考文献:

答案 2 :(得分:1)

首先,我建议你稍微简化你的正则表达式。我的建议是:

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

由于您有 3组 字符后跟-符号,因此非常简单。

现在,为了只捕获那些所需的匹配项,如果您正在测试这些字符串,则只需要添加^$分隔符。

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

请检查this Regex101 link以查看其实际效果。

相关问题