3

今日、いくつかの Javascript 正規表現を学んでいますが、次のコードがどのように機能するかを理解できていません。

var toswop = 'last first\nlast first\nlast first';
var swapped = text.replace(/([\w]+)\b([\w ]+)/g,'$2 $1');
alert(swapped);

正しい順序に入れ替えられた単語を正しく警告しますが、次のコード (2 番目の \w の後にスペースがないことに注意してください) は機能しません。元の順序で印刷するだけです。

var toswop = 'last first\nlast first\nlast first';
var swapped = text.replace(/([\w]+)\b([\w]+)/g,'$2 $1');
alert(swapped);
4

3 に答える 3

1

このような表現に通じます。非単語文字が見つかるまで、すべての単語文字を検索します。それは最初の単語をキャッチします。

次に、スペースまたは単語文字である次の一致を探します。したがって、角括弧内にスペースがないと、名前のスペースは一致しません。それが、スペースのない代替案では失敗する理由です。

これは\bよりもスペースを明示的に入れて書いたほうがいいと思います。

于 2012-12-08T08:54:59.350 に答える
1

スペースとのマッチングの使い方が間違っていると思います'\b'が、JavaScript の正規表現'\b'は単語の先頭または末尾と一致します。

したがって/([\w]+)\b/、正規表現のこの部分は、 word の最後までしか一致しません'last'。残りの文字列は' first'(先頭のスペースに注意してください)。

次に、これが必要な残りと一致させるために、これは「任意の単語文字または空白文字の 1 つ以上の出現」([\w ]+)に変換されます。これは、残りの文字列と一致させる必要があるものです。' first'

単語が入れ替わっていても、単語の前にスペースがあることに注意してください'first'

これをさらに証明するには、入力を次のように変更したとします。

var toswop = 'last first another\nlast first another\nlast first another';

スワップされたテキストが次のようになることがわかります

 first another last
 first another last
 first another last 

これは、正規表現の最後のセグメントが([\w ]+)スペースと単語文字の両方と一致し続け、一致に「another」という単語が含まれていたためです。

ただし、角かっこからスペースを削除すると、残りの部分と一致しませ' first'ん。これは、「word character」の文字列ではなく、「space」+「word character」の文字列であるためです。

そのため、ここではスペースが重要です。

しかし、次のように正規表現を変更すると:

swapped = toswop.replace(/([\w]+)\s([\w]+)/g,'$2 $1');

次に\s、2つの単語の真ん中にあるスペースと一致するため、スペースなしで機能します。

これで質問が明確になることを願っています。

JavaScript 正規表現構文については、http ://www.w3schools.com/jsref/jsref_regexp_begin.asp を参照してください。

もっと実験したい場合は、私のフィドルについてはこちらを参照してください:http://jsfiddle.net/BuddhiP/P5Jqm/

于 2012-12-08T04:26:06.843 に答える
1

MDNから:

\w

アンダースコアを含む任意の英数字に一致します。に相当し[A-Za-z0-9_]ます。

たとえば、in およびinに/\w/一致'a'します。"apple," '5'"$5.28,"'3'"3D."

スペースを追加すると、文字セットが英数字とアンダースコアから、英数字とアンダースコアとスペースに変更されます。

于 2012-12-08T03:22:19.863 に答える