3

ここに私の 2 番目の質問への答えがあります: 文字「a」が 1 回以上出現する単語を検索するには

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。
じゃあんま

次に、定義済みの出現回数 (x と呼びます) の文字 'a' を持つ単語を探すにはどうすればよいでしょうか。f(x)=ガンマ if 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 に答える