language tagの正規表現がBCP 47と定義されている必要があります。言語タグの正規表現(BCP47で定義)
完全なBNF構文はhttp://www.rfc-editor.org/rfc/bcp/bcp47.txtにあり、私はそれを使って自分自身を書くことができると知っていますが、うまくいけばそこに既にあるものがあります。
language tagの正規表現がBCP 47と定義されている必要があります。言語タグの正規表現(BCP47で定義)
完全なBNF構文はhttp://www.rfc-editor.org/rfc/bcp/bcp47.txtにあり、私はそれを使って自分自身を書くことができると知っていますが、うまくいけばそこに既にあるものがあります。
次のようになります。ここでは
^((?<grandfathered>(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|
i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|
cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?<language>
([A-Za-z]{2,3}(-(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})
(-(?<script>[A-Za-z]{4}))?(-(?<region>[A-Za-z]{2}|[0-9]{3}))?(-(?<variant>[A-Za-z0-9]{5,8}
|[0-9][A-Za-z0-9]{3}))*(-(?<extension>[0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*
(-(?<privateUse>x(-[A-Za-z0-9]{1,8})+))?)|(?<privateUse>x(-[A-Za-z0-9]{1,8})+))$
は(C#で)それを生成するためのコードです:
var regular = "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)";
var irregular = "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)";
var grandfathered = "(?<grandfathered>" + irregular + "|" + regular + ")";
var privateUse = "(?<privateUse>x(-[A-Za-z0-9]{1,8})+)";
var singleton = "[0-9A-WY-Za-wy-z]";
var extension = "(?<extension>" + singleton + "(-[A-Za-z0-9]{2,8})+)";
var variant = "(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})";
var region = "(?<region>[A-Za-z]{2}|[0-9]{3})";
var script = "(?<script>[A-Za-z]{4})";
var extlang = "(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2})";
var language = "(?<language>([A-Za-z]{2,3}(-" + extlang + ")?)|[A-Za-z]{4}|[A-Za-z]{5,8})";
var langtag = "(" + language + "(-" + script + ")?" + "(-" + region + ")?" + "(-" + variant + ")*" + "(-" + extension + ")*" + "(-" + privateUse + ")?" + ")";
var languageTag = @"^(" + grandfathered + "|" + langtag + "|" + privateUse + ")$";
Console.WriteLine(languageTag);
私は(私はタイプミスをしたかもしれない)、その正しさを保証することはできませんが、それは動作します付録Aの例を参考にしてください。
環境によっては、指定されたキャプチャグループ"?<...>"
を削除する必要があります。
素晴らしいです、ありがとう!いくつかの変更を加えた後にPHPでうまくいきます。私は自分自身に尋ねていました。それらの名前付きキャプチャグループは何をしていますか?これは私が知る限り、PHPの正規表現の構文で利用できる機能ではありませんが、私は興味があります。 –
@Timインデックスを作成するのではなく、名前でグループにアクセスすることができます。例えば'match.Groups [" variant "]' – porges
私はこれが "普通の粗末な"セクションを適切に解決するとは思っていません(彼らは特別なコードではなく普通のタグとして解析されます)。 'languageTag'の定義中に' langtag'変数の前に 'grandfathered'変数を置く必要があります。 –
PHPで動作する最適化バージョン。
/^(?<grandfathered>(?:en-GB-oed|i-(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|t(?:a[oy]|su))|sgn-(?:BE-(?:FR|NL)|CH-DE))|(?:art-lojban|cel-gaulish|no-(?:bok|nyn)|zh-(?:guoyu|hakka|min(?:-nan)?|xiang)))|(?:(?<language>(?:[A-Za-z]{2,3}(?:-(?<extlang>[A-Za-z]{3}(?:-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(?:-(?<script>[A-Za-z]{4}))?(?:-(?<region>[A-Za-z]{2}|[0-9]{3}))?(?:-(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(?:-(?<extension>[0-9A-WY-Za-wy-z](?:-[A-Za-z0-9]{2,8})+))*)(?:-(?<privateUse>x(?:-[A-Za-z0-9]{1,8})+))?$/Di
ハハ。私は数週間前に自分でこれをやったが、残念ながら私のディスク(新しいSSDだった)が死んだ。私はもう一度見てみましょう:) – porges
@PaulPRO:言語タグは最も確実です。 – porges