Regex 在正则表达式捕获组中搜索重复项?

Regex 在正则表达式捕获组中搜索重复项?,regex,regex-lookarounds,lookaround,Regex,Regex Lookarounds,Lookaround,我只是用正则表达式匹配了一个字符串 我想匹配一个包含3个字母/数字组合的字符串。 它可能包含一个a、B或L,后面跟一个数字1-3。(对于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)

我只是用正则表达式匹配了一个字符串

我想匹配一个包含3个字母/数字组合的字符串。 它可能包含一个a、B或L,后面跟一个数字1-3。(对于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)
我不想匹配的字符串(现在匹配):


如果我理解正确,这将起作用:

^(?=.*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 L2B1A3-匹配 B2L1A2-匹配 A1B1L4-匹配 A1A2A3-不匹配 L4B4A1-不匹配 L2A1B-不匹配 细分:

^ # 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 ^#字符串开头 (?=.*A)#A必须出现在字符串中的任何位置 (?=.*B)#B必须出现在字符串中的任何位置 (?=.*L)#L必须出现在字符串中的任何位置 (#开始捕获组 [AB][1-3]#A或B和1-3 |#或 L[1-4]#L和1-4 ){3} #终端组 $#字符串末尾
三个lookahead必须满足,而主组也必须匹配三次,这一事实考虑了字母不能加倍的条件。

如果我理解正确,这将起作用:

^(?=.*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 L2B1A3-匹配 B2L1A2-匹配 A1B1L4-匹配 A1A2A3-不匹配 L4B4A1-不匹配 L2A1B-不匹配 细分:

^ # 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 ^#字符串开头 (?=.*A)#A必须出现在字符串中的任何位置 (?=.*B)#B必须出现在字符串中的任何位置 (?=.*L)#L必须出现在字符串中的任何位置 (#开始捕获组 [AB][1-3]#A或B和1-3 |#或 L[1-4]#L和1-4 ){3} #终端组 $#字符串末尾
三个lookahead必须满足,而主组也必须匹配三次,这一事实考虑到了字母不能加倍的条件。

只是提供了一种替代方法。

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


优点在于,当向正则表达式中添加比ABL更多的字母时,正则表达式将更加简洁。

只是提供了一种替代方法。

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


优点是,当向正则表达式中添加比ABL更多的字母时,正则表达式将更加简洁。

这个
^(?。*[AB]4)([ALB])[1-4](?:(?!\1)([ALB])[1-4])(?:(?!\1|\2)([ALB])[1-4])$怎么样?demo@WiktorStribiżew他不想匹配
A1A2A3
@AvinashRaj:如果问题清楚,我会公布答案。也许OP需要。Milkmannetje,你能提供全面的测试用例吗?什么字符串是有效的,哪些是无效的?我想我的测试用例很清楚…那么我的正则表达式比公认的等效字符串短一点。这个
^(?)(!*[AB]4)([ALB])[1-4](?:(?!\1)([ALB])[1-4])(?:(?!\1 |\2)([ALB])[1-4])$怎么样?demo@WiktorStribiżew他不想匹配
A1A2A3
@AvinashRaj:如果问题清楚,我会公布答案。也许OP需要。Milkmannetje,你能提供全面的测试用例吗?哪些字符串是有效的,哪些是无效的?我想我的测试用例是清楚的…那么我的正则表达式比公认的等效字符串短一点。是的,请注意!这正是我需要的!是的,没错!这正是我需要的!