文字またはマークのカテゴリ (ASCII カテゴリだけでなく) の任意のコードポイントに一致するものに似たものがあるはずであり\w
、できれば句読点などの [[P*]] などのフィルターを備えている必要があります。
12 に答える
ES6の状況
ECMAScript言語仕様、エディション6(一般にES2015とも呼ばれます)には、Unicode対応の正規表現が含まれています。u
正規表現の修飾子を使用してサポートを有効にする必要があります。機能の内訳といくつかの注意事項については、ES6のUnicode対応の正規表現を参照してください。
ES6は、ブラウザーとNode.jsなどのスタンドアロンJavascriptランタイムの両方で広く採用されているため、ほとんどの場合、この機能を使用するために余分な労力は必要ありません。完全な互換性リスト:https ://kangax.github.io/compat-table/es6/
ES 5以下の状況(レガシーブラウザ)
ES6Unicode正規表現を同等のES5に変換するregexpuという名前のトランスパイラーがあります。ビルドプロセスの一部として使用できます。オンラインでお試しください。。
JavaScriptはUnicode文字列で動作しますが、Unicode対応の文字クラスを実装しておらず、POSIX文字クラスまたはUnicodeブロック/サブ範囲の概念もありません。
ここであなたの期待を確認してください:Javascript RegExp Unicode文字クラステスター(編集:元のページがダウンしていますが、インターネットアーカイブにはまだコピーがあります。)
Flagrant Badasseryには、JavaScript、正規表現、およびUnicodeに関する記事があり、この問題に光を当てています。
SOでここで正規表現とUnicodeも読んでください。おそらく、独自の「句読点文字クラス」を作成する必要があります。
正規表現:Unicodeブロック範囲に一致ビルダーを確認してください。これを使用すると、指定した任意の数のUnicodeブロックに含まれる文字に一致するJavaScript正規表現を作成できます。
「一般句読点」と「補助句読点」のサブ範囲に対して実行したところ、予想どおりに単純でわかりやすい結果が得られました。
[\u2000-\u206F\u2E00-\u2E7F]
XRegExpもあります。これは、拡張機能を備えた代替正規表現エンジンを提供することにより、JavaScriptにUnicodeサポートをもたらすプロジェクトです。
そしてもちろん、必読:mathiasbynens.be-JavaScriptにはUnicodeの問題があります:
良い解決策も見つからなかったので、私はずっと前に、Unicode仕様(v.5.0.0) からデータをダウンロードし、BMP の各 Unicode カテゴリとサブカテゴリの間隔を生成する小さなスクリプトを書きました (最近、小さなスクリプトに置き換えられました)。独自のネイティブ Unicode サポートを使用するJava プログラム)。
基本的には、Tomalak が言及したツール\p{...}
の出力と同様に、値の範囲に変換されますが、間隔が非常に大きくなる可能性があります (ブロックを扱っているのではなく、さまざまな場所に散らばっている文字を扱っているため)。
たとえば、次のように記述された正規表現:
var regex = unicode_hack(/\p{L}(\p{L}|\p{Nd})*/g);
次のようなものに変換されます。
/[\u0041-\u005a\u0061-\u007a...]([...]|[\u0030-\u0039\u0660-\u0669...])*/g
実際にはあまり使用していませんが、私のテストでは問題なく動作しているように見えるので、誰かが役に立つと思った場合に備えてここに投稿します. 結果の正規表現の長さ (上記の例は、展開すると 3591 文字になります) にもかかわらず、パフォーマンスは許容できるようです (jsFiddle でのテストを参照してください。@modiX と @Lwangaman の改善に感謝します)。
ソースは次のとおりです (生、27.5KB、縮小、24.9KB、それほど良くはありません...)。Unicode 文字のエスケープを解除して小さくすることもできますが、OTOH ではエンコーディングの問題が発生するリスクがあるため、そのままにしておきます。うまくいけば、ES6 では、この種のことはもう必要ありません。
更新: これは、Tim Down が言及したXRegExp Unicode プラグインで採用されたのと同じ戦略のように見えますが、この場合は通常の JavaScript 正規表現が使用されています。
他の回答で述べたように、JavaScript 正規表現は Unicode 文字クラスをサポートしていません。ただし、これを提供するライブラリがあります: Steven Levithan の優れたXRegExpとそのUnicode プラグイン。
これはそれを行います:
/[A-Za-z\u00C0-\u00FF ]+/.exec('hipopótamo maçã pólen ñ poção água língüa')
Unicode 文字の範囲を明示的に選択します。ラテン文字には有効ですが、その他の奇妙な文字はこの範囲外になる可能性があります。
JavaScript では、\w と \d は ASCII ですが、\s は Unicode です。理由を聞かないでください。JavaScript は Unicode カテゴリで \p をサポートします。これを使用して、Unicode 対応の \w および \d をエミュレートできます。
\d には \p{N} (数値) を使用します
\w には [\p{L}\p{N}\p{Pc}\p{M}] (文字、数字、アンダースコア、マーク) を使用します。
更新:残念ながら、私はこれについて間違っていました。JavaScript も公式には \p をサポートしていませんが、一部の実装ではまだこれをサポートしている可能性があります。JavaScript 正規表現での唯一の Unicode サポートは、特定のコード ポイントを \uFFFF と照合することです。文字クラスの範囲でそれらを使用できます。
Babelを使用している場合、Unicode サポートはすでに利用可能です。
のような正規表現を記述できるようにソース コードを変換するプラグインもリリースしました/^\p{L}+$/
。これらは、ブラウザが理解できるものに変換されます。
プラグインのプロジェクトページは次のとおりです。