我有这个正则表达式:
([abc])(?!\1)([abc])(?!\2|\1)([abc])
找到" abc"的任何排列。 (abc,acb,bac,bca,cab和cba)在给定的字符串中,例如:
aabbccabcabbccaassbbsdddbbsbdbabc
正则表达式运行良好,但现在我需要另一个正则表达式来做同样的事情,但是所有的排列都没有重复" abbc" (12种组合)
我需要在一个字符串中找到4个字符,其中有一个" a",2" b"和一个" c"。无论顺序如何,都必须连续。 (abbc,babc,bbca ......)
我的问题与建议的问题不同,因为它有一个必须重复2次的字符
1. Find [abc]
2. Find "a" or "c" if it is not in 1.
Find "b"
3. Find "a" or "c" if it doesn't appear in 1. or 2.
Find "b" if it is not alreday 2 times
4. Find "a" or "c" if it doesn't appear in 1. or 2 or 3.
Find "b" if it is not alreday 2 times
答案 0 :(得分:4)
C#正则表达式有一个名为balancing groups的功能,可用于计数。
您可以使用此正则表达式(working example at Regex Storm):
(?:(?<A>a)|(?<B>b)|(?<C>c)){4}(?<-A>)(?<-B>){2}(?<-C>)
(?<A>a)
- 匹配a
并将其推送到名为A
的堆栈。(?<-A>)
- 从堆栈A弹出。(?<-B>){2}
- 从堆栈B中弹出两次。如果正则表达式引擎无法从堆栈弹出,则匹配失败,因此这为我们提供了一种计算匹配字符的简便方法。
还有其他方法,包括可以在其他正则表达式(其他语言)中使用的方法,但是这种方法有一个好处,它可以很好地扩展并且没有重复:如果你想要7个字符是4 A
s,2 B
s和C
,这是一个微不足道的变化。