如何查找包含x(和一个或多个)字母的所有单词?

时间:2013-08-20 17:08:02

标签: javascript regex

我在第二个问题的答案就在这里: 查找包含一个或多个字母“a”的单词

var re = /(\w+a)/;

关于上述问题,它是如何运作的?例如,

var re = /(\w+a)/g;
var str = "gamma";
console.log(re.exec(str));

输出:

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

然而;这些不是我预期的结果(尽管它是我想要的)。也就是说,应该找到模式,以便出现任意数量的\ w。然后第一次出现字母'a'。然后停下来。 即我期待:ga。
然后是妈妈

接下来,我如何查找字母'a'的预定次数(称为x)的单词。这样f(x)= gamma iff x = 2。

3 个答案:

答案 0 :(得分:3)

正则表达式中的重复是greedy。这是尽可能多的。你碰巧得到了完整的单词,因为它以a结尾。为了使它不合适,(停在第一个),你会使用:

\w+?a

但要真正得到完整的词,我宁愿使用

\w*a\w*

请注意*,否则只会将a作为第一个或最后一个字母的字词出现问题。

要获得完全 2 a的字词,您需要从重复的字母中排除a。最好使用否定字符类,不允许使用非单词字符和a。此外,你需要确保,你得到完整的单词。使用单词边界\b

可以轻松完成此操作
\b[^\Wa]*a[^\Wa]*a[^\Wa]*\b

为了在重复次数方面具有更大的灵活性,可以将其重写为

\b[^\Wa]*(?:a[^\Wa]*){2}\b

答案 1 :(得分:0)

默认情况下,正则表达式是贪婪的。这意味着,如果他们可以抓住更多的角色。使用量词时需要考虑贪婪,比如+和*。

使量词不贪婪(懒惰)后缀为?

/(\w+?a)/

答案 2 :(得分: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过滤它们。