正则表达式正好4个字母3位数任何订单

时间:2018-02-08 17:04:45

标签: regex

我正在尝试使用正则表达式来解决这个问题:

正确: IUG4455 I4UG455 A4U345A

错: IUGG453 IIUG44555

需要正好是4个字母(按任意顺序)和3个数字(按任意顺序)。

我尝试使用那个表达式

[A-Z]{3}\\d{4}

但它只接受以字母(4)开头,然后是数字(3)。

2 个答案:

答案 0 :(得分:5)

你有几个选择:

选项1 See regex in use here

\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

选项2 See regex in use here

\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