2011-10-26 6 views
4

文字列オブジェクトのsearch()メソッドを使用して、正規表現と文字列の一致を検索します。Javascript正規表現と日本語

それは、英語の単語のために正常に動作します:

"google".search(/\bg/g) // return 0 

しかし、このコードは、日本の文字列では動作しません:

"アイスランド語".search(/\bア/g) // return -1 

にはどうすれば日本の間の一致を見つけるために正規表現を変更することができますし、正規表現ですか?

答えて

4

悲しいことに、Javascriptは「ASCIIのみ」の正規表現です。 Unicodeはサポートされていません(つまり、Unicodeの非ASCII文字は「クラスに分割されていません」という意味なので、例えば\dは0-9です)。 Javascriptで高度な正規表現(Unicode regexes)が必要な場合は、試してみることができますhttp://xregexp.com/

サロゲートペアの問題を掘り下げません。 Javascriptの文字はUTF-16ポイントなので、必ずしも "完全な" Unicode文字であるとは限りません。幸いにも、日本語は完全にBMPになるはずです(ただし、Han unificationはPlane 2にありますので、それぞれの文字は2x UTF-16文字です)

Unicodeについて読んでみたい場合は、 Wiki Mapping of Unicode charactersなどです。

+0

お返事ありがとうございます。正規表現を変更し、サードパーティのJSライブラリ(xregexp.com)を使用しない方法がありますか? – Andrei

+1

@Andrei技術的には、この「言語」「.search(/ ^ア/ g)」が動作します。 (限られた例で)。しかし、それはあなたが望むものではありません:-) Javascriptはゼロ幅のルックバックを持っていないので、さらに複雑です(他の言語で '(?<=^| [、。;:/() - ]) 'これは、文字の前に文字列の先頭や空白や'、 'などが必要であることを意味します) – xanatos

3

問題は\bです。 \bとしてのみ一致します。文字列の最初の文字の前に

  • を、最初の文字は 単語文字である場合。
  • 文字列の最後の文字の後に、最後の 文字が単語文字の場合。
  • 文字列内の2文字の間には、 があります。一方は単語文字で、もう一方は単語文字ではありません。

(参照:http://www.regular-expressions.info/wordboundaries.html)を

とJavaScriptで単語文字は、文字クラス[a-zA-Z0-9_]ref /ワード境界/ ECMA = ASCII)です。

+0

返信いただきありがとうございます! – Andrei

+0

はい、これは興味深いことですが、Andreiは良い理由があると確信していますが、とにかく\ b(単語境界)は日本語の文脈で意味をなさないようです。 一般に、日本語にはスペースはありません。また、私が見ることができる単語境界であると思われるものを明確に示す方法はありません。 たとえば:私はアイランドランドのごはんがすき最初のは単語境界として機能していますが、後で同じ文字が使用されますが、単語境界ではありません。 単語の境界であるかどうかを判断する前に、その言語を解析する必要があるようです。 – PandaWood

+0

@PandaWood私は同じことを考えましたが、私はまだ日本の研究の初心者であるので、私は正しく説明できない表面的な知識を流出したくありませんでした。 ;) – Yoshi