1

「@」でマークされた文字列から (潜在的にハイフンでつながれた) 単語を抽出しようとしています。

たとえば、文字列から

var s = '@moo, @baa and @moo-baa are writing an email to a@bc.de'

戻りたい

['@moo', '@baa', '@moo-baa']

メールアドレスを取得しないようにするために、グループの前に空白文字または行頭があることを確認します。

s.match(/(^|\s)@(\w+[-\w+]*)/g)

これでうまくいくようですが、スペースもキャプチャされますが、これは望ましくありません。

["@moo", " @baa", " @moo-baa"]

このようにグループ化を沈黙させる

s.match(/(?:^|\s)@(\w+[-\w+]*)/g)

動作していないようで、以前と同じ結果を返します。反対のことも試してみて、グループの前に \w または \S がないことを確認しましたが、行頭も除外されています。単純にスペースを削除できることはわかっていますが、1 回の「一致」呼び出しだけでこれを機能させたいと思っています。

誰かが私が間違っていることを提案していますか? よろしくお願いします!

[編集]

また、気付きました:「@」記号も返すのはなぜですか?! つまり、それは私が望んでいることですが、なぜそれをしているのですか? 彼らはグループ外ですよね?

4

2 に答える 2

2

私の知る限りString.match、「g」修飾子を使用すると、一致全体が返されます。修飾子を使用すると、部分式 (グループ) から番号付きの一致を作成するのではなく、式全体に一致するように関数に指示しているためです。グローバル マッチはグループを返しません。代わりに、グループはマッチそのものです。

あなたの場合、探していた正規表現は次のようになります。

'@moo, @baa and @moo-baa are writing an email to a@bc.de'.match(/(?!\b)(@[\w\-]+)/g);

単語の境界に沿っていないすべての「@」記号を探しています。したがって、サイレント グループは必要ありません。

于 2012-07-17T23:01:28.713 に答える
1

スペースをキャプチャしたくない場合\sは、括弧の内側を入れないでください。括弧内はすべて、キャプチャグループの一部として返されます。

于 2012-07-17T18:28:22.367 に答える