javascript - 正则表达式让前瞻功能适用于字符串中的每个单独单词

标签 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

最佳答案

这里的要点是将 . 限制在前瞻中。请注意,. 匹配除换行符之外的任何字符。如果除换行符之外的 任何 0+ 个字符后面有一个数字,则前瞻 (?=.*\d) 返回 true,因此,所有words before a valid match are also matched .

由于您仅匹配大写字母和数字,因此请使用 [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 - 后跟单词边界。

关于javascript - 正则表达式让前瞻功能适用于字符串中的每个单独单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46052431/

相关文章:

javascript - 如何使用 JavaScript 在 SVG 中创建属性?

javascript - 在没有 ng-init 的情况下在 Angular 选择中选择的选项

javascript 急切赋值

javascript - 将工作表复制到另一个电子表格 [Google Apps 脚本]

Python - 域名的正则表达式

java - 在 Java 中提取文本而无需条件前瞻

Python(Perl 类型)正则表达式先行/后行

regex - 重命名 linux 目录中文件的最佳过程

java - String类正则表达式难度

regex - elasticsearch 上的负前瞻正则表达式