我正在尝试使用正则表达式来解决这个问题:
正确: IUG4455 I4UG455 A4U345A
错: IUGG453 IIUG44555
需要正好是4个字母(按任意顺序)和3个数字(按任意顺序)。
我尝试使用那个表达式
[A-Z]{3}\\d{4}
但它只接受以字母(4)开头,然后是数字(3)。
答案 0 :(得分:5)
你有几个选择:
\b(?=(?:\d*[A-Z]){3})(?=(?:[A-Z]*\d){4})[A-Z\d]{7}\b
\b
断言位置为单词边界(?=(?:\d*[A-Z]){3})
确定以下匹配的积极前瞻
(?:\d*[A-Z]){3}
完全匹配以下3次
\d*
任意次数匹配[A-Z]
匹配任何大写ASCII字符(?=(?:[A-Z]*\d){4})
确定以下匹配的积极前瞻
(?:[A-Z]*\d){4}
完全匹配以下4次
[A-Z]*
任意次数匹配任何大写ASCII字符\d
匹配任何数字[A-Z\d]{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-Z\d]{7}\b
\b(?=(?:\d*[A-Z]){3}(?!\d*[A-Z]))(?=(?:[A-Z]*\d){4}(?![A-Z]*\d))[A-Z\d]+\b
与选项1类似,但使用负向前瞻以确保字符串中不存在额外字符(大写ASCII字母或数字)。
背靠背有两个正向前瞻模拟and
,以确保从该特定位置开始满足两个子模式。由于您有两个条件(3个大写ASCII字母和4个数字),您应该使用两个前瞻。
答案 1 :(得分:1)
作为替代方案,
(?:(?<d>\d)|(?<c>[A-Z])){7}(?<-d>){3}(?<-c>){4}
不需要任何外观。它只匹配七个字母或数字,然后检查它找到3位数字和4个字母。
调整3和4以品尝...您的示例有4位数字和3个字母。
还可以添加单词边界或锚点,具体取决于您是尝试匹配整个单词还是整个string
。