RegEx让前瞻为字符串中的每个单独的单词工作

时间:2017-09-05 10:12:33

标签: javascript regex regex-lookarounds regex-group

我试图创建一个正则表达式,从包含多个单词的字符串中提取单个引用号。

参考编号是任何带有6个或更多字符的大写字母数字字。即GAF7887979,897979等

到目前为止,我使用以下内容来捕获这些引用:[A-Z\d-]{6,}结合正向预测,以确保匹配中至少有一位数:(?=.*\d)

但是我需要过滤掉一个特定的格式化日期,如下所示:19MAR19这样做我使用负面预测:(?!\d{2}[A-Z]{3}1\d)似乎工作正常。

最终的正则表达式为:(?!\d{2}[A-Z]{3}1\d)(?=.*\d)[A-Z\d-]{6,}

所以这一切对于一个单词来说都很好用,但是在一个包含多个单词的字符串中,前瞻似乎并不适用于每个单词,而是用于整个字符串(可理解的),如果字符串中至少有一个数字,那么一切都会最终匹配:(

无论如何都要让前瞻性重新应用到正则表达式中的每个新单词吗?

示例:

Example regex at work

1 个答案:

答案 0 :(得分:3)

这里的要点是限制前瞻内的.。请注意.匹配除换行符之外的任何字符。前瞻(?=.*\d)会返回 true ,如果除了换行符之外的任何 0+字符后面有一个数字,那么,所有words before a valid match are also matched。< / p>

由于您只匹配大写字母和数字,因此请使用[A-Z\d]*代替.*

您还需要单词边界以确保匹配整个单词。

使用

\b(?!\d{2}[A-Z]{3}1\d)(?=[A-Z\d]*\d\b)[A-Z\d-]{6,}\b

请参阅regex demo

<强>详情

  • \b - 领先的字边界
  • (?!\d{2}[A-Z]{3}1\d) - 没有2位数字,3个大写ASCII字母,1和字边界后面的数字
  • (?=[A-Z\d]*\d\b) - 必须有任何0+大写字母或/和数字以及带有字边界的数字
  • [A-Z\d-]{6,} - 六位或更多位/字母/ -
  • \b - 后跟一个单词边界。