gpt4 book ai didi

javascript - 正则表达式让前瞻对字符串中的每个单独的单词起作用

转载 作者:行者123 更新时间:2023-11-29 19:02:16 25 4
gpt4 key购买 nike

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

引用编号是任何包含 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

最佳答案

这里的要点是限制 . 在 lookahead 中。请注意 . 匹配除换行符以外的任何字符。如果 any 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com