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。
然后mm

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

4

3 回答 3

4

正则表达式中的重复是贪婪的。那就是尽可能多地使用。你碰巧得到了完整的单词,因为它以a. 为了让它变得不贪心,(停在第一个),你会使用:

\w+?a

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

\w*a\w*

请注意*,否则您会遇到a仅作为第一个或最后一个字母的单词的问题。

要获得正好2的单词,a您需要a从重复的字母中排除。这最好使用否定字符类来完成,它不允许非单词字符和as。此外,您需要确保获得完整的单词。这很容易用边界词完成\b

\b[^\Wa]*a[^\Wa]*a[^\Wa]*\b

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

\b[^\Wa]*(?:a[^\Wa]*){2}\b
于 2013-08-20T17:19:26.070 回答
0

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

要使量词不贪心(懒惰),请在其后缀?.

/(\w+?a)/
于 2013-08-20T17:19:01.023 回答
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 过滤它们。

于 2013-08-20T17:21:50.997 回答