JavaScript regexpおよび境界
-
24-10-2019 - |
質問
同僚が私に正規表現の問題について尋ねましたが、私は彼のために見つけて答えることができないようです。
境界を使用してテキストエディターの特定の長さのテキストを強調表示していますが、問題を示すサンプルコードを次に示します。
<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で同じ動作がありますが、誰もが理由を知っていますか?
解決
あなたがregexpに渡すあなたの文字列のバックスラッシュから逃げる必要があるので、私はそれがうまくいかないと思います。あなたはこれを持っています:
var rx = new RegExp('\bAlpha\b','gim');
あなたはこれを必要とします:
var rx = new RegExp('\\bAlpha\\b','gim');
regexpに渡した文字列には、2つのバックスペース文字があります。 \b
バックスペースを文字列に挿入するためのエスケープシーケンスです。別のバックスラッシュで各バックスラッシュを逃れる必要があります。
他のヒント
regexpはエスケープキャラクターを逃がす必要があります:
new RegExp('\\bAlpha\\b')
これは文字列の問題です。 \b
文字列に文字通りはバックスペースです!
RegExp('\\bAlpha\\b','gim');
正しいフォームになります
JavaScriptに正規表現を書く方法は2つあります
- リテラル
- regexpオブジェクト
文字通り、教科書で学んだように使用して、EG / Balabala /しかし、regexpオブジェクトでは、正規表現は文字列として書かれています。
次のコードを試してみてください。JavaScriptで文字列が振る舞うことがわかります。
alert("O\K");
alert("O\\K");
テキストアレアまたは入力ボックスにregexpが書かれた別の機会があります。例えば、
http://www.pagecolumn.com/tool/regtest.htm
この場合、 in regexpを逃れる必要はありません。
実際、あなたはに渡された文字列のすべてをバックスラッシュする必要があります 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-"]