我一直在尝试验证VB.net中的字符串,该字符串必须包含这三个字母,而不是特定顺序,并且不需要彼此相邻。 ABC
我可以使用LINQ
轻松完成MessageBox.Show(("ABC").All(Function(n) ("AAAABBBBBCCCC").Contains(n)).ToString)
然而,在搜索谷歌和SO超过一个星期后,我完全被难倒了。我最接近的模式是".*[A|B|C]+.*[A|B|C]+.*[A|B|C]+.*"
,AAA
如何也会返回true。我知道我可以在尝试一周之后使用其他方法做到这一点我真的想知道它是否可能使用一个正则表达式。
答案 0 :(得分:6)
你可以利用积极的前瞻:
^(?=.*A)(?=.*B)(?=.*C).+
(?=.*A)
确保字符串中有一个A,并且相同的逻辑适用于其他前瞻。
答案 1 :(得分:5)
您的原始模式无效,因为它会匹配任意数量的字符,后跟一个或多个A
,B
,C
或|
个字符,后跟任意数量的字符,后跟一个或多个A
,B
,C
或|
字符,后跟任意数量的字符,后跟一个或多个字符A
,B
,C
或|
字符,后跟任意数量的字符。
我可能会使用您已编写的代码,但如果您真的想使用正则表达式,则可以使用一系列lookahead assertions,如下所示:
(?=.*A)(?=.*B)(?=.*C)
这将匹配任何包含A
,B
和C
的字符串。
答案 2 :(得分:0)
它必须是正则表达式吗?这是没有人可以很容易解决的问题。
我从未在VB中编程,但我确信有一些辅助函数可以让你接受一个字符串,并查询字符是否出现在其中。
如果str是你的字符串,可能是:
str.contains('A')&& str.contains('B')&& str.contains( 'C')
答案 3 :(得分:0)
您可以使用零宽度前瞻。如果不符合某个标准,前瞻性很好地消除了匹配的可能性。
例如,让我们使用
这两个词untie queue unique block unity
从基本单词匹配开始:
\b\w+\b
要求与\w+
匹配的字词以un
开头,我们可以使用 正向前瞻
\b(?=un)\w+\b
这说的是
\b
匹配空白(?=un)
是否有字母“un”?如果没有,没有比赛。如果是,则可能匹配。\w+
一个或多个单词字符\b
匹配空白如果不满足里面的表达式,那么积极的先行可以消除匹配的可能性。它适用于正则之后的正则表达式。因此,(?=un)
适用于上面的\w+
表达式,并要求它从un
开始。如果没有,则\w+
表达式将不匹配。
如何匹配不以un
开头的任何字词?只需使用“否定前瞻”
\b(?!un)\w+\b
\b
匹配空白(?!un)
是否有字母“un”?如果 SO ,则不匹配。如果没有,则可能匹配。\w+
一个或多个单词字符\b
匹配空白因此,您需要在字符串中至少包含1 A,1 B和1 C,这样的模式
(?=.*A)(?=.*B)(?=.*C).+
有效,因为它说:
(?=.*A)
- 是否有.*
后跟A的任何字符?如果是这样,如果不匹配则可能匹配。(?=.*B)
- 是否有.*
后跟B的任何字符?如果是这样,如果不匹配则可能匹配。(?=.*C)
- 是否有.*
后跟C的任何字符?如果是这样,如果不匹配则可能匹配。.+
如果满足上述3个前瞻要求,则匹配任何字符。如果没有,则不匹配任何字符(因此没有匹配)