1. ホーム
  2. ジャバスクリプト

[解決済み】アクセント記号付き文字(ダイアクリティック)の具体的なJavaScript正規表現について)

2022-04-04 11:38:15

質問

スタックオーバーフローで調べたところ、( 文字を置き換える......え , JavaScript が RegExp に関して Unicode 標準に従わない理由 という疑問に対する具体的な答えはまだ見つかっていません。 JavaScript はどのようにしてアクセント記号付きの文字(発音記号付き文字)をマッチングさせることができますか? "

UIのフィールドに強制的にフォーマットを合わせています。 last_name, first_name (最後の[カンマ・スペース]を最初に) しかし、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]+$/

  • Unicode文字の範囲にマッチします。テストして動作していますが、おかしなことは試していませんし、私たちの言語学部で教員名に使われているような普通のものです。

以下は私の懸念事項です。

  1. 最初の解決策はあまりにも限定的で、しかもずさんで複雑なものです。1文字でも2文字でも忘れたら変更する必要があり、とても実用的とは言えません。

  2. 2つ目の解決策は簡潔で良いのですが、おそらく実際にマッチングさせるべき内容よりもはるかに多くマッチングしてしまいます。に関する本当のドキュメントを見つけることができませんでした。 まさに . は、単に "改行文字以外のすべての文字" という一般化された文字にマッチします("quot "は、"quot "を意味します)。 MDN ).

  3. 3番目の解決策が最も正確なように見えますが、何かゴチャゴチャしているのでしょうか?私はUnicodeにあまり詳しくありませんが、少なくとも実際のところ コード表 / 続き , \u00C0-\u017F は、少なくとも私の予想する入力に対しては、かなり強固なものであると思われます。

  • 教員は母国語(アラビア語、中国語、日本語など)で名前を書いて提出することはないので、ラテン文字セット外の文字について心配する必要はありません。

この3つのアプローチのうち、どれが最も適しているのでしょうか?それとも、もっと良い解決策があるのでしょうか?

どのように解決するのか?

すべてのアクセントを受け入れるための簡単な方法はこうです。

[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 [ ] ^ \ × ÷

参照 ユニコード文字表 をクリックすると、数字順に並んだ文字が表示されます。