11

我一直在尝试验证 VB.net 中的一个字符串,该字符串必须以无特定顺序包含这三个字母,并且不需要彼此相邻。美国广播公司

我可以使用 LINQ 轻松做到这一点

MessageBox.Show(("ABC").All(Function(n) ("AAAABBBBBCCCC").Contains(n)).ToString)

然而,在谷歌和 SO 搜索了一个多星期后,我完全被难住了。我最接近的模式是".*[A|B|C]+.*[A|B|C]+.*[A|B|C]+.*"如何AAA也将返回 true。我知道我可以在尝试一周后使用其他方法来做到这一点我真的很想知道它是否可以使用一个正则表达式。

4

4 回答 4

13

您的原始模式将不起作用,因为它会匹配任意数量的字符,后跟一个或多个A, B, C, or|字符,后跟任意数量的字符,后跟一个或多个A, B, C, or|字符,后跟任意数量的字符,后跟一个或多个A, B, C, 或|字符,后跟任意数量的字符。

我可能会使用您已经编写的代码,但如果您真的想使用正则表达式,您可以使用一系列前瞻断言,如下所示:

(?=.*A)(?=.*B)(?=.*C)

这将匹配任何包含A、和 的字符串B,并且C以任何顺序。

于 2013-09-05T18:11:02.223 回答
6

您可以利用积极的前瞻:

^(?=.*A)(?=.*B)(?=.*C).+

(?=.*A)确保字符串中某处有一个 A,并且相同的逻辑适用于其他前瞻。

于 2013-09-05T18:10:33.430 回答
2

您可以使用零宽度前瞻。如果不符合特定标准,前瞻非常适合消除匹配可能性。

例如,让我们使用这些词

untie queue unique block unity

从基本的单词匹配开始:

\b\w+\b

\w+要要求与开头匹配的单词un,我们可以使用正向前瞻

\b(?=un)\w+\b

这说的是

  • \b匹配一个空白
  • (?=un)有字母“un”吗?如果不是,则不匹配。如果是这样,那么可能匹配。
  • \w+一个或多个单词字符
  • \b匹配一个空白

如果不满足内部表达式,则正向前瞻会消除匹配的可能性。它适用于它之后的正则表达式。所以(?=un)适用于\w+上面的表达式并要求它 BEGINS WITH un。如果不匹配,则\w+表达式将不匹配。

匹配任何以 开头的单词怎么un样?只需使用“负前瞻”

\b(?!un)\w+\b
  • \b匹配一个空白
  • (?!un)有字母“un”吗?如果是,则不匹配。如果不是,则可能匹配。
  • \w+一个或多个单词字符
  • \b匹配一个空白

因此,对于您在字符串中至少有 1 个 A、1 B 和 1 C 的要求,像这样的模式

(?=.*A)(?=.*B)(?=.*C).+

有效,因为它说:

  • (?=.*A)- 它.*后面有任何字符吗?如果是这样,如果不是不匹配,则可能匹配。
  • (?=.*B)- 有.*没有后跟 B 的字符?如果是这样,如果不是不匹配,则可能匹配。
  • (?=.*C)- 它有.*任何字符后跟C吗?如果是这样,如果不是不匹配,则可能匹配。
  • .+如果满足上述 3 个前瞻要求,则匹配任何字符。如果不是,则不匹配任何字符(因此不匹配)
于 2018-01-05T18:15:35.907 回答
0

它必须是正则表达式吗?这是没有人可以轻松解决的问题。

我从未在 VB 中编程过,但我确信有一些辅助函数可以让您获取一个字符串,并查询其中是否出现字符。

如果 str 是您的字符串,可能类似于:

str.contains('A') && str.contains('B') && str.contains('C')

于 2013-09-05T18:11:50.893 回答