2

同僚から正規表現の問題について尋ねられましたが、見つけて答えられないようです。

テキスト エディターで特定の長さのテキストを強調表示するために境界を使用していますが、問題を示すサンプル コードを次に示します。

<script type="text/javascript">
var str = "Alpha , Beta, Gamma Delta Epsilon, AAlphaa, Beta Alpha<br/>";
var rx = new RegExp('\bAlpha\b','gim');

document.write(str.replace(/\b(Alpha)\b/gim, '-- $1 --'));
document.write(str.replace(rx, '== $1 =='));
</script>

問題は、最初のリテラル str.replace は機能しますが、RegExp オプションは機能しません。

IE と FF で同じ動作をしていますが、その理由を知っている人はいますか?

4

5 に答える 5

11

RegExp に渡す文字列のバックスラッシュをエスケープする必要があるため、機能しないと思います。あなたはこれを持っています:

var rx = new RegExp('\bAlpha\b','gim');

あなたはこれを必要とします:

var rx = new RegExp('\\bAlpha\\b','gim');

RegExp に渡した文字列\bには、文字列にバックスペースを挿入するためのエスケープ シーケンスであるため、2 つのバックスペース文字が含まれています。各バックスラッシュを別のバックスラッシュでエスケープする必要があります。

于 2010-06-03T13:49:08.377 に答える
2

RegExp では、エスケープ文字をエスケープする必要があります。

new RegExp('\\bAlpha\\b')
于 2010-06-03T13:49:29.597 に答える
2

これは文字列の問題です。\b文字列リテラルではバックスペースです!

RegExp('\\bAlpha\\b','gim');正しい形だろう

于 2010-06-03T13:49:44.073 に答える
1

Javascript で正規表現を記述する方法は 2 つあります。

  1. リテラル
  2. 正規表現オブジェクト

文字通り、教科書で習った /balabala/ を使いますが、RegExp オブジェクトでは正規表現は文字列として記述されます。

次のコードを試してみてください。JavaScript でどのような文字列が動作するかがわかります。

alert("O\K");
alert("O\\K");

Regexp がテキストエリアまたは入力ボックスに書き込まれる別の機会があります。例えば、

http://www.pagecolumn.com/tool/regtest.htm

この場合、正規表現の \ をエスケープする必要はありません。

于 2010-06-03T14:08:25.607 に答える
0

実際、 RegExpコンストラクターに渡される文字列内のすべてをバックスラッシュする必要があります。

var re = /my_([\w_]+-\d-)regexp/

と同等です:

var re = new RegExp("my_\(\[\\\w_\]+-\\\d-\)regexp")

そして、どちらも次のばかげた例に一致します:

"my_very_obvious-4-regexp".match(re)
["my_very_obvious-4-regexp", "very_obvious-4-"]
于 2011-08-02T12:50:43.263 に答える