我试图创建一个正则表达式,从包含多个单词的字符串中提取单个引用号。
参考编号是任何带有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 :(得分: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
- 后跟一个单词边界。