regex - 语言标签的正则表达式(由 BCP47 定义)

标签 regex bnf

我需要一个 language tag 的正则表达式由 BCP 47 定义.

我知道完整的 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 中的示例中运行良好。

根据您的环境,您可能需要删除命名的捕获组 "?<...>" .

关于regex - 语言标签的正则表达式(由 BCP47 定义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7035825/

相关文章:

grammar - 是EBNF标准的在线版本不正确,还是Mr.的章节名称不正确?帕蒂斯?

c# - 正则表达式:目标并部分替换

c++ - 一个简单的 C++ 程序示例的 BNF 语法

regex - 接受数字范围的模式?

c# - 如何在 C# 中编译正则表达式

parsing - 将 EBNF 转换为 BNF 以用于 LALR 解析器

max - EBNF 最大代币

java - Antlr AST 构建

regex - sed 和正则表达式问题

javascript - 如何在将拆分器保留在数组中的同时通过正则表达式拆分字符串