在RegEx捕获组中搜索重复项?

时间:2016-11-21 13:58:59

标签: regex regex-lookarounds lookaround

我只是将一个字符串与正则表达式匹配。

我想匹配一个包含3个字母/数字组合的字符串。 它可能包含数字1-3后面的A,B或L. (如果是L,1-4)

我的问题: 当字母匹配多次时,我不想匹配字符串。所以A,B和L只能出现一次。

到目前为止我的表达:

(?:[A|L|B](?(?<=L)[1-4]|[1-3])){3}

此时匹配的测试字符串:

L2B1A3
B2L1A2
A1B1L4
A1A2A3

此时不匹配的字符串:

L4B4A1 (Only L can have a digit that's 4)
L2A1B (Missing digit)

我不想匹配的字符串(现在匹配):

A2A2A3 (The A, B and L only may occur one time!)

2 个答案:

答案 0 :(得分:3)

如果我理解正确,这将有效:

^(?=.*A)(?=.*B)(?=.*L)([AB][1-3]|L[1-4]){3}$

给出了

L2B1A3  - match
B2L1A2  - match
A1B1L4  - match
A1A2A3  - no match
L4B4A1  - no match
L2A1B   - no match

击穿:

^             # start of string
(?=.*A)       # A must occur anywhere in the string
(?=.*B)       # B must occur anywhere in the string
(?=.*L)       # L must occur anywhere in the string
(             # begin capturing group
  [AB][1-3]   #   A or B and 1-3
  |           #   or
  L[1-4]      #   L and 1-4
){3}          # end group
$             # end of string

当主要组必须匹配三次以及时必须满足三个前瞻的事实处理了字母不得加倍的条件。

答案 1 :(得分:1)

提供另一种方法。

^(?!.*([A-Z]).*\1)(?:[AB][1-3]|L[1-4]){3}$

带有反向捕获组1 (?!.*([A-Z]).*\1)的负前瞻确保大写字母仅在字符串中出现一次。

优势在于,当正则表达式中添加的字母数量超过ABL时,正则表达式会更加简洁。