241

文字またはマークのカテゴリ (ASCII カテゴリだけでなく) の任意のコードポイントに一致するものに似たものがあるはずであり\w、できれば句読点などの [[P*]] などのフィルターを備えている必要があります。

4

12 に答える 12

216

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ブロック/サブ範囲の概念もありません。

于 2008-11-11T12:35:13.503 に答える
56

良い解決策も見つからなかったので、私はずっと前に、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 正規表現が使用されています。

于 2012-01-19T21:28:50.570 に答える
32

他の回答で述べたように、JavaScript 正規表現は Unicode 文字クラスをサポートしていません。ただし、これを提供するライブラリがあります: Steven Levithan の優れたXRegExpとそのUnicode プラグイン

于 2010-12-15T09:37:29.547 に答える
10

これはそれを行います:

/[A-Za-z\u00C0-\u00FF ]+/.exec('hipopótamo maçã pólen ñ poção água língüa')

Unicode 文字の範囲を明示的に選択します。ラテン文字には有効ですが、その他の奇妙な文字はこの範囲外になる可能性があります。

于 2015-05-05T16:46:21.030 に答える
9

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 と照合することです。文字クラスの範囲でそれらを使用できます。

于 2008-11-26T10:33:57.840 に答える
7

Babelを使用している場合、Unicode サポートはすでに利用可能です。

のような正規表現を記述できるようにソース コードを変換するプラグインもリリースしました/^\p{L}+$/。これらは、ブラウザが理解できるものに変換されます。

プラグインのプロジェクトページは次のとおりです。

babel-plugin-utf-8-regex

于 2015-05-08T18:24:58.213 に答える