正则表达式匹配包含所有特定字母的单词?

6

我试图编写一个正则表达式,匹配包含所有指定字母的任意单词。

例如:

a,b

Aaron: not match
Abby: match
Barry: match
Bobb: not match
Alley: not match
Abel: match
Bella: match

有什么想法吗?

这必须是正则表达式的原因是什么?单独测试每个字母要简单得多。 - ColBeseder
4个回答

7
(?=\w*a)(?=\w*b)\w+

在到达空格或非单词字符之前,请检查是否有“a”和“b”,然后捕获单词结束前的所有字符。


@faalbane 你确定吗?对我来说它是正常工作的。你正在使用哪个程序/语言进行测试? - ColBeseder
JavaScript搜索json编码的PHP数组 - draft
"no aa bb ab no aa bb ba".match(/(?=\w*a)(?=\w*b)\w+/g); 给我返回了 ["ab", "ba"] - ColBeseder
@shA.t OP 要求匹配单词,而不是行。因此,我认为\w\S比点更合适。 - ColBeseder
1
就像我说的那样,更通用的方法是在\b...\b中查找单词,这样更有意义。 - shA.t
显示剩余2条评论

3
这里提供一种直接的方法。
(.*[Aa].*[bB])|(.*[Bb].*[Aa])

这将需要至少有一个 'a' 和一个 'b'。

您可以在这里找到更多关于这些和其他主题的信息和教程。


如果你有这样一行代码:Aaron bobby,会发生什么? - ColBeseder
应该捕获那个。还是你专注于大写字母A?如果是这样,(?=.*[aA]) - David Hoelzer
哦!嗯...让我测试一下...等一下。 - David Hoelzer
好的,抱歉。我测试了一下。环顾周围的工作不像我预期的那样。这将使用可选方案执行两个前瞻。 - David Hoelzer
此外,您可能会发现这个网站对于交互式测试非常有用:http://regexr.com - David Hoelzer
你的答案对于 a,b 来说很好,但对于 a,b,c,d 来说就有点糟糕了 ;)。 - shA.t

1
(\w*[Aa]\w*[bB]\w*)|(\w*[Bb]\w*[Aa]\w*)

David 的方法启发了我。但是 David 最初的建议之一存在的问题是需要匹配以 A 或 B 结尾。

你的回答对于 a,b 来说不错,但对于 a,b,c,d 来说就有点糟糕了 ;)。 - shA.t
只有当一个人不喜欢使用排列时,这才是可怕的 :) 但同意,a和b只是例子。正则表达式可能不是答案。 - Jon

0

这是我会使用的(Python语法):

word_with_a_and_b = re.compile(r"""
    # Match word having both "a" and "b".
    \b            # Anchor to start of word.
    (?=[^\Wa]*a)  # Assert word contains an "a".
    (?=[^\Wb]*b)  # Assert word contains a "b".
    \w+           # Match the word having both "a" and "b".
    \b            # Anchor to end of word.
    """, re.VERBOSE | re.IGNORECASE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接