我正在尝试创建一个正则表达式,以从包含多个单词的字符串中提取单个引用号。
引用号是任何包含 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,}
所以这对于单个单词来说一切都很好,但是在包含多个单词的字符串中,前瞻似乎不适用于每个单词,而是适用于整个字符串(可以理解),所以一切都结束了如果字符串中至少有一位数字,则向上匹配:(
是否有办法将前瞻重新应用于正则表达式中的每个新单词?
示例:
最佳答案
这里的要点是将 .
限制在前瞻中。请注意,.
匹配除换行符之外的任何字符。如果除换行符之外的 任何 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/