如何找到所有具有 x (一个或多个) 字母出现次数的单词?

3
我这里有关于第二个问题的答案: 要查找包含一个或多个字母'a'的单词。
var re = /(\w+a)/;

关于上述内容,它是如何工作的?例如,
var re = /(\w+a)/g;
var str = "gamma";
console.log(re.exec(str));

输出:

[ 'gamma', 'gamma', index: 0, input: 'gamma' ]

然而,这些并不是我预期的结果(尽管这就是我想要的)。也就是说,re应该找到这样的模式,即\w可以出现任意次数。然后是字母'a'的第一次出现。然后停止。 也就是说,我期望的是:ga。
然后是mma。

接下来,我如何查找具有预定义数量的字母'a'出现次数(称其为x)的单词。使得f(x)=gamma当且仅当x=2。


该正则表达式对于/(\w+a)/.test("abc")将返回false - Vivin Paliath
好奇...为什么这样解释?我以为它们是“贪婪的”。 - user2316667
没关系,beuttener的回答里有。有点类似于*和+的区别。它正在寻找任何字母的1个或多个出现(将'a'作为结果),然后寻找'a'。 - user2316667
3个回答

4
正则表达式中的重复是贪婪的(greedy)。这意味着它会尽可能多地匹配。你刚好匹配到了完整的单词,因为它以 a 结尾。要使其非贪婪(在第一个处停止),你可以使用:
\w+?a

但是要获取完整的单词,我更愿意使用

\w*a\w*

请注意*,否则你将会在仅有一个a作为单词首字母或者末字母时遇到问题。
要获取恰好含有两个a的单词,你需要排除重复的a。最好使用取反字符类来实现,该字符类不允许非单词字符和a。此外,你需要确保获取完整的单词。这可以通过单词边界\b轻松实现:
\b[^\Wa]*a[^\Wa]*a[^\Wa]*\b

为了更灵活地控制重复次数,可以将其重写为:
\b[^\Wa]*(?:a[^\Wa]*){2}\b

1
你是对的。我用了一个愚蠢的例子。“gammam”并不能得到完整的单词。 - user2316667

0

正则表达式默认是贪婪的。这意味着如果它们可以获取更多的字符,它们就会这样做。在使用量词(如+和*)时,您需要考虑贪婪性。

要使量词不贪婪(懒惰),请在其后缀中加上?

/(\w+?a)/

0

您可以使用正则表达式来处理一些内容,例如

/\b\w*a\w*\b/ - find a word with at least 1 a (can match the word 'a')
/\b\w*(?:a\w*){2}\b/ - find a word with at least 2 as

但当数量精确时,情况就变得棘手了,因为您必须更改\w以包括除a之外的所有字母...通过否定类来实现

/\b[^\Wa]*(?:a[^\Wa]*){2}\b/ - matches a word with exactly 2 as 

要找到直到字母"a"的音节,您可以使用以下代码:

/\b(?:[^\Wa]*a)/ - matches ga alone and in gamma

/\b(?:[^\Wa]*a){1,4}/ - matches word having 1-4 a, ending in a.

实现类似这样的功能最简单的方法是匹配所有单词 /\w+/,并通过Javascript进行过滤。


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