JavaScriptのUTF-8ワード境界正規表現
-
04-10-2019 - |
質問
JavaScript:
"ab abc cab ab ab".replace(/\bab\b/g, "AB");
正しく私に与えてください:
"AB abc cab AB AB"
ただし、UTF-8文字を使用する場合:
"αβ αβγ γαβ αβ αβ".replace(/\bαβ\b/g, "AB");
単語境界演算子 うまくいかないようです:
"αβ αβγ γαβ αβ αβ"
これに対する解決策はありますか?
解決
単語境界アサーションは、単語文字の前に先行しないか、別の単語文字が続く場合にのみ一致します(したがって .\b.
に等しい \W\w
と \w\W
)。と \w
と定義されている [A-Za-z0-9_]
. 。それで \w
ギリシャ語のキャラクターとは一致しません。したがって、使用できません \b
この場合。
代わりにできることは、これを使用することです。
"αβ αβγ γαβ αβ αβ".replace(/(^|\s)αβ(?=\s|$)/g, "$1AB")
他のヒント
すべてのJavaScript regexp実装がUnicode ADのサポートがあるわけではないので、逃げる必要があります
"αβ αβγ γαβ αβ αβ".replace(/\u03b1\u03b2/g, "AB"); // "AB ABγ γAB AB AB"
文字をマッピングするには、 http://htmlhelp.com/reference/html40/entities/symbols.html
もちろん、これは境界問題という言葉(他の答えで説明されているように)に役立ちませんが、少なくともキャラクターを適切に一致させることができるはずです
プログラム可能であり、句読点、ブラケットなどを処理するために何かが必要でした。
var wordToReplace = '買い手',
replacementWord = '[[BUYER]]',
text = 'Mange 買い手 information. The selected Store and Classification will be the default on the สั่งซื้อ.'
function replaceWord(text, wordToReplace, replacementWord) {
var re = new RegExp('(^|\\s|\\(|\'|"|,|;)' + wordToReplace + '($|\\s|\\)|\\.|\'|"|!|,|;|\\?)', 'gi');
return text.replace(re, replacementWord);
}
JavaScript Resource Editorを書いたので、このページを見つけて、Unicodeに適した単語境界パラメータ化されたRegexpを見つけることができなかったため、必然的に答えました。
JavaScriptに関連するRegexのすべての実装がユニコードを認識しているわけではありません。
たとえば、IEで使用したMicrosofts JScriptはANSIに限定されています。
Unicodeと自然言語の言葉を扱っているとき、あなたはおそらく使用するよりも境界にもっと注意したいと思うでしょう \b
. 。見る この答え 詳細と指示について。