スタックオーバーフロー( 文字の置き換え.. eh 、 JavaScriptがRegExpに関するUnicode標準に準拠していない方法 など)を調べましたが、実際には見つかりませんでした質問に対する具体的な答え:
How can JavaScript match for accented characters (those with diacritical marks)?
私はUIのフィールドをフォーマットに強制的に一致させています:last_name, first_name
(last [comma space] first)、発音区別符号のサポートを提供したいのですが、明らかにJavaScriptでは他の言語/プラットフォームよりも少し難しい。
これは、発音区別記号のサポートを追加するまで、私のオリジナルバージョンでした。
/^[a-zA-Z]+,\s[a-zA-Z]+$/
現在、サポートを追加する3つの方法の1つについて議論しています。これらはすべてテストし、動作しています(少なくともある程度、2番目のアプローチの「範囲」が何であるかは本当にわかりません)。どうぞ:
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
accentedCharacters
でサポートされているアクセント付き文字のいずれかと姓/名を正しく一致させます。.
文字クラスを使用して、より単純な式を作成することでした:var regex = /^.+,\s.+$/;
something, something
の形式で、ほぼすべてに一致します。大丈夫だと思う.../^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
私の懸念は次のとおりです。
.
が一致するものに関する実際のドキュメントは見つかりませんでした。「改行文字以外の任意の文字」の一般化( MDNの表から) )。3番目の解決策が最も正確に思えますが、何か落とし穴はありますか?少なくとも実際にはUnicodeにあまり詳しくありませんが、 コードテーブル / そのテーブルの続き を見ると、少なくとも\u00C0-\u017F
はかなり安定しているようです。予想される入力。
実際の質問:これらの3つのアプローチのどれがタスクに最も適していますか?または、より良い解決策はありますか?
これらの3つのアプローチのうち、どれがタスクに最も適していますか?
タスクに依存します:-)すべてのラテン文字とそのアクセント付きバージョンを正確に一致させるには、Unicode範囲がおそらく最適なソリューションを提供します。これらは、\S
文字クラスを使用して行うことができる、すべての非空白文字に拡張される場合があります。
UIのフィールドを次の形式に一致させます:
last_name, first_name
(最後の[コンマスペース]が最初)
ここで私が見ている最も基本的な問題は発音区別符号ではなく、空白です。複数の単語で構成される名前がいくつかあります。タイトル用。したがって、最も一般的な名前を使用する必要があります。つまり、姓と名を区別するコンマ以外はすべて許可されます。
/[^,]+,\s[^,]+/
しかし、.
文字クラスを使用する2番目のソリューションは同じようにうまくいき、複数のコンマに注意するだけで済みます。
すべてのアクセントを受け入れる簡単な方法は次のとおりです。
[A-zÀ-ú] // accepts lowercase and uppercase characters
[A-zÀ-ÿ] // as above but including letters with an umlaut (includes [ ] ^ \ × ÷)
[A-Za-zÀ-ÿ] // as above but not including [ ] ^ \
[A-Za-zÀ-ÖØ-öø-ÿ] // as above but not including [ ] ^ \ × ÷
数字順にリストされている文字については、 https://unicode-table.com/en/ を参照してください。
ラテン語のアクセント付きの範囲\u00C0-\u017F
は、名前のデータベースには十分ではなかったため、正規表現を
[a-zA-Z\u00C0-\u024F]
[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars
これらのコードブロックを追加しました(\u00C0-\u024F
には3つの隣接するブロックが同時に含まれています):
\u00C0-\u00FF
Latin-1 Supplement\u0100-\u017F
Latin Extended-A\u0180-\u024F
Latin Extended-B\u1E00-\u1EFF
ラテン語拡張追加より多くのコードポイントが必要な場合は、Wikipediaの nicode文字のリスト でより多くの範囲を見つけることができます。たとえば、 Latin Extended-C 、 D 、および E を追加することもできますが、歴史家だけを除外しました。今それらに興味を持っているようで、DとEのセットは私のブラウザでも正しくレンダリングされません。
\u017F
で停止する元の正規表現は、「Șenol」という名前で中断されました。 FontSpaceのUnicode Analyzer によると、その最初の文字は\u0218
で、ローマ字の大文字のSとコンマが付いています。 (ええ、通常はセディリャS \u015E
、「Şenol」と綴られます。しかし、私はトルコに飛んで、「あなたの名前の綴りが間違っています!」と言います。)
XRegExp ライブラリには nicodeというプラグイン があり、このようなタスクの解決に役立ちます。
<script src="xregexp.js"></script>
<script src="addons/unicode/unicode-base.js"></script>
<script>
var unicodeWord = XRegExp("^\\p{L}+$");
unicodeWord.test("Русский"); // true
unicodeWord.test("日本語"); // true
unicodeWord.test("العربية"); // true
</script>
質問へのコメントで言及されていますが、見落としがちです。この回答を送信して初めて気づきました。
これはどう?
/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/
これはどうですか?
^([a-zA-Z]|[à-ú]|[À-Ú])+$
アクセント記号付き文字を含むすべての単語に一致します。
このwikiから: https://en.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin
ラテン文字の場合、私は
/^[A-zÀ-ÖØ-öø-ÿ]+$/
ハイフンと特殊文字を避けます