1

FFとChromeの両方で次のことを試しています

' 1 2 3 4 5 6 '.replace(/([\s()])(\d+)([\s()])/g, '$1[num $2]$3');

私が期待している結果:

" [num 1] [num 2] [num 3] [num 4] [num 5] [num 6] "

私が得ている結果(両方のブラウザー):

" [num 1] 2 [num 3] 4 [num 5] 6 "

単純化しても同じ結果が得られます。

' 1 2 3 4 5 6 '.replace(/\s(\d+)\s/g, ' [num $1] ');

何が起こっているのかアイデアはありますか?

4

3 に答える 3

1

はい、あなた\sはキャラクターを消費しています。正規表現の複数の一致は、無限ループを防ぐために前方に実行されます。したがって、最初の試合の後、あなたはすでに2の直前にいますが、一致するスペースがないため、それを無視します。

やりたいことは、先読みを使用して一致を非消費的にするか\b、単語境界の幅がゼロの一致を使用することです。

' 1 2 3 4 5 6 '.replace(/([\s()])(\d+)(?=[\s()])/g, '$1[num $2]')

これはあなたのために働くはずです。

于 2013-03-25T22:21:28.283 に答える
1

コメントから回答を移動し、前向きな先読みを追加しました:

' 1 2 3 4 5 6 '.replace(/(\s)(\d+)(?=\s)/g, '$1[num $2]');
于 2013-03-25T22:38:25.410 に答える
0

これを試して:

' 1 2 3 4 5 6 '.replace(/(\d+)/g, '[num $1]');
于 2013-03-25T22:21:40.183 に答える