web-dev-qa-db-ja.com

アクセント記号付き文字(発音記号)の具体的なJavascript正規表現

スタックオーバーフロー( 文字の置き換え.. ehJavaScriptが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の形式で、ほぼすべてに一致します。大丈夫だと思う...

最後のアプローチは、私が found の方が簡単かもしれません...

/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
  • ユニコード文字の範囲と一致します-テスト済みで動作していますが、私は何もクレイジーにしようとはしませんでしたが、私たちの言語部門で教職員の名前について見た通常のものだけです。

私の懸念は次のとおりです。

  1. 最初の解決策は非常に限定的であり、その点でずさんで複雑です。 1つまたは2つのキャラクターを忘れた場合は変更する必要がありますが、それはあまり実用的ではありません。
  2. 2番目の解決策はより適切で簡潔ですが、おそらく実際に必要なものよりもはるかに一致します。 exactly.が一致するものに関する実際のドキュメントは見つかりませんでした。「改行文字以外の任意の文字」の一般化( MDNの表から) )。
  3. 3番目の解決策が最も正確に思えますが、何か落とし穴はありますか?少なくとも実際にはUnicodeにあまり詳しくありませんが、 コードテーブル / そのテーブルの続き を見ると、少なくとも\u00C0-\u017Fはかなり安定しているようです。予想される入力。

    • 教員は、母国語(例:アラビア語、中国語、日本語など)で名前を付けたフォームを送信しないため、ラテン文字セットの文字がずれていることを心配する必要はありません。

実際の質問:これらの3つのアプローチのどれがタスクに最も適していますか?または、より良い解決策はありますか?

115
Chris Cirefice

これらの3つのアプローチのうち、どれがタスクに最も適していますか?

タスクに依存します:-)すべてのラテン文字とそのアクセント付きバージョンを正確に一致させるには、Unicode範囲がおそらく最適なソリューションを提供します。これらは、\S文字クラスを使用して行うことができる、すべての非空白文字に拡張される場合があります。

UIのフィールドを次の形式に一致させます:last_name, first_name(最後の[コンマスペース]が最初)

ここで私が見ている最も基本的な問題は発音区別符号ではなく、空白です。複数の単語で構成される名前がいくつかあります。タイトル用。したがって、最も一般的な名前を使用する必要があります。つまり、姓と名を区別するコンマ以外はすべて許可されます。

/[^,]+,\s[^,]+/

しかし、.文字クラスを使用する2番目のソリューションは同じようにうまくいき、複数のコンマに注意するだけで済みます。

15
Bergi

すべてのアクセントを受け入れる簡単な方法は次のとおりです。

[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/ を参照してください。

176
Maycow Moura

ラテン語のアクセント付きの範囲\u00C0-\u017Fは、名前のデータベースには十分ではなかったため、正規表現を

[a-zA-Z\u00C0-\u024F]
[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars

これらのコードブロックを追加しました(\u00C0-\u024Fには3つの隣接するブロックが同時に含まれています):

より多くのコードポイントが必要な場合は、Wikipediaの nicode文字のリスト でより多くの範囲を見つけることができます。たとえば、 Latin Extended-CD 、および E を追加することもできますが、歴史家だけを除外しました。今それらに興味を持っているようで、DとEのセットは私のブラウザでも正しくレンダリングされません。

\u017Fで停止する元の正規表現は、「Șenol」という名前で中断されました。 FontSpaceのUnicode Analyzer によると、その最初の文字は\u0218で、ローマ字の大文字のSとコンマが付いています。 (ええ、通常はセディリャS \u015E、「Şenol」と綴られます。しかし、私はトルコに飛んで、「あなたの名前の綴りが間違っています!」と言います。)

22

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>

質問へのコメントで言及されていますが、見落としがちです。この回答を送信して初めて気づきました。

14
thorn̈

これはどう?

/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/
9
alchn

これはどうですか?

^([a-zA-Z]|[à-ú]|[À-Ú])+$

アクセント記号付き文字を含むすべての単語に一致します。

6

このwikiから: https://en.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin

ラテン文字の場合、私は

/^[A-zÀ-ÖØ-öø-ÿ]+$/ 

ハイフンと特殊文字を避けます

5
fdsfdsfdsfds