我在第二个问题的答案就在这里: 查找包含一个或多个字母“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。
答案 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过滤它们。