12

単純な正規表現の一致で多くの問題が発生しています。

この文字列にアクセント付きの文字があり(これは単なる例です)"Botó Entrepà Nadó Facebook! "、別のリストの単語を使用して単語を照合したいと思います。

これは私のコードの簡略版です。たとえば、「Botó」と一致させる

var matchExpr = new RegExp ('\\b' + 'Botó' + '\\b','i'); 
"Botó Entrepà Nadó Facebook! ".match(matchExpr);

実行すると、期待どおりに「」と一致しませんBotó(Firefox、IE、Chrome)。

私はそれが私の側のエラーだと思った。しかし、ここに楽しみがあります...

このように文字列を変更し(「」の後"Botón Entrepà Nadó Facebook! "の「」に注意してください)、同じコードを実行すると、次のようになります。nBotó

var matchExpr = new RegExp ('\\b' + 'Botó' + '\\b','i'); 
"Botón Entrepà Nadó Facebook! ".match(matchExpr);

「」に一致しますBotó!!!!????? (少なくともFirefoxでは)。「」は単語の境界ではないため、これは私には意味nがありません(これはによって一致し\bます)。

単語全体を一致させようとすると:

var matchExpr = new RegExp ('\\b' + 'Botón' + '\\b','i'); 
"Botón Entrepà Nadó Facebook! ".match(matchExpr);

できます。

もう少し奇妙にするために、最後に別のアクセント付き文字を追加します。

var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i'); 
"Botóñ Entrepà Nadó Facebook! ".match(matchExpr);

これを一致させようとすると、何も一致しません。しかし、これを試してみると

var matchExpr = new RegExp ('\\b' + 'Botóñ' + '\\b','i'); 
"Botóña Entrepà Nadó Facebook! ".match(matchExpr);

「」と一致しBotóñます。どちらが間違っています。

「Facebook」と一致させようとすると、期待どおりに機能します。中央にアクセントのある単語を一致させようとすると、期待どおりに機能します。しかし、最後にアクセントのある単語を一致させようとすると失敗します。

私は何が間違っているのですか?これは予想される動作ですか?

4

2 に答える 2

5

残念ながら、Javascript の短縮文字クラスは Unicode (または拡張 ASCII) をサポートしていません。

この質問への回答を見てみましょう: Javascript + Unicode。その質問にリンクされているこの記事、JavaScript、Regex、および Unicode\bは、次のように定義される単語境界によって定義されると述べています。

→ Word character — A ~ Z、az、0 ~ 9、および _ の文字のみ。
→ 単語境界 — 単語文字と非単語文字の間の位置。

そのため、末尾に がある単語では機能しますがA-Z, a-z, 0-9, and _、末尾にアクセント付きの文字がある場合は機能しません。

于 2011-03-15T12:33:15.300 に答える
3

ES3仕様から:

内部ヘルパー関数 IsWordChar は、整数パラメーター e を受け取り、次の処理を実行します。

  1. e == –1 または e == InputLength の場合、false を返します。
  2. c を文字 Input[e] とする。
  3. c が以下の表の 63 文字のいずれかである場合、true を返します。

    a b c d e f g h i j k l m n o p q r s t u v w x y z
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    0 1 2 3 4 5 6 7 8 9 _
    
  4. false を返します。

"IsWordChar()" 内部 (おそらく架空の) 関数は、"\b" アサーションの動作の基礎です。

編集— ES5 では改善されません。

于 2011-03-15T12:35:56.353 に答える