我正在尝试做一条正则以获取这种情况:
正确:IUG4455i4ug455A4U345A
错误:IUGG453IIUG44555
需要正好是4个字母(以任何顺序(和3位数字(以任何顺序(。
我尝试使用该表达式
[A-Z]{3}\d{4}
但它仅接受字母(4(然后数字(3(。
您有几个选择:
选项1 :请参阅此处使用的REGEX
b(?=(?:d*[A-Z]){3})(?=(?:[A-Z]*d){4})[A-Zd]{7}b
-
b
断言一个单词边界的位置 -
(?=(?:d*[A-Z]){3})
积极的lookahead确保以下匹配-
(?:d*[A-Z]){3}
匹配以下3次-
d*
匹配任意数字的任何次数 -
[A-Z]
匹配任何大写ASCII字符
-
-
-
(?=(?:[A-Z]*d){4})
阳性lookahead确保以下匹配-
(?:[A-Z]*d){4}
匹配以下4次-
[A-Z]*
匹配任何大写ASCII字符,任意次数 -
d
匹配任何数字
-
-
-
[A-Zd]{7}
匹配任何数字或大写ASCII字符,完全7次 -
b
断言为单词边界
如果需要考虑速度,则可以扩展上述选项并使用以下内容:
b(?=d*[A-Z]d*[A-Z]d*[A-Z])(?=[A-Z]*d[A-Z]*d[A-Z]*d[A-Z]*d)[A-Zd]{7}b
选项2 :请参阅此处使用的REGEX
b(?=(?:d*[A-Z]){3}(?!d*[A-Z]))(?=(?:[A-Z]*d){4}(?![A-Z]*d))[A-Zd]+b
类似于选项1,但使用负面lookahead来确保字符串中不存在额外的字符(大写ASCII字母或数字(。
有两个正面的lookaheads背对背模拟and
,以确保从该特定位置开始满足两个子图案。由于您有两个条件(3个大写ASCII字母和4位数字(,因此应使用两个LookAheads。
作为替代方案,
(?:(?<d>d)|(?<c>[A-Z])){7}(?<-d>){3}(?<-c>){4}
不需要任何外观。它只是匹配了七个字母或数字,然后检查它找到了3个数字和4个字母。
调整3和4的品味...您的示例有4位数字和3个字母。
还添加单词边界或锚定,具体取决于您要匹配整个单词还是整个string
。