我对正则表达式一无所知,但我想我必须使用它来解决我的问题,我有一些看起来像这样的文件名:
MyResource
MyResource.en-GB
MyResource.en-US
MyResource.fr-FR
MyResource.de-DE
我的想法是测试我的字符串是否以" [letter] [letter] - [letter] [letter]"
结尾我知道这是一个非常棒的人,但我不知道怎么做,即使我确切地知道我想做什么...... :(
答案 0 :(得分:9)
这将测试你的输入:
\.[a-z]{2}-[A-Z]{2}$
这实际上非常直观:“匹配一个点(\.
,点是正则表达式中的特殊字符),后面跟着a
到z
中的任意一个字符中的两个( [a-z]{2}
- [...]
是一个字符类),后跟短划线(-
),后跟两个A
到Z
中的任意字符({ {1}}),然后输入结束([A-Z]{2}
)。
http://www.dotnetperls.com/regex-match< - 如何在C#中对输入应用此正则表达式。这意味着代码看起来像(UNTESTED):
$
http://regex.info< - 购买并阅读它,它是宇宙中正则表达式的最佳资源
http://regular-expressions.info< - 第二个最佳资源
答案 1 :(得分:6)
为了迎合基本变体:
^[A-Za-z]{2,4}([_-]([A-Za-z]{4}|[0-9]{3}))?([_-]([A-Za-z]{2}|[0-9]{3}))?$
包括:
有效的例子是:
请注意,某些编程语言的函数可能只接受特定的表单,例如只有下划线和大写的国家/地区代码。 PHP的intl函数接受case和separator。 PayPal仅接受语言或la_CY
表单。
IETF RFC 5646,它管理这些标签的互联网使用情况,建议像上面前三个例子中使用的大写和分离格式,如az-Cyrl-AZ
,尽管它说处理器应该接受任何混合的案例和最后两个例子中的任何一个分隔符。
但是,它还表明不应自动应用大小写转换,因为它可能会产生无效结果。这意味着,如果请求区域设置字符串,则要么显示一个显式列表,要么只在键入每个字符时接受推荐案例的条目。
推荐的基本格式的正则表达式是:
^[a-z]{2,4}(-([A-Z][a-z]{3}|[0-9]{3}))?(-([A-Z]{2}|[0-9]{3}))?$
正则表达式仅涵盖基本格式。有额外的变种,如当地区域。 CLDR包含区域设置en_US_POSIX
和ca_ES_VALENCIA
。这一切都取决于所需的粒度。 RFC 5646允许此类变体,以及私有扩展和向后兼容表单。
如果使用基于CLDR的函数集(如PHP的intl
扩展名),则必须查找区域设置资源包以查看区域设置是否实际存在 - 至少在CLDR数据库时包括版本 - 否则相应的本地化可能会产生不良结果,甚至失败。
后者提出了一个问题:为什么不做一个选项列表呢? 好吧,CLDR语言环境资源包需要时间来加载和解析,因为它加载了很多其他内容(700多个条目,50MB),因此正则表达式是一个很好的前端健全性检查,可以过滤掉非法字符,或保留格式可能的未来添加。
答案 2 :(得分:1)
您可以尝试这样的事情:
[a-z]{2}-[a-z]{2}
答案 3 :(得分:1)
cultures = CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures);
cultures.Where(o => filename.EndsWith(o.Name));
答案 4 :(得分:1)
你几乎在问题中回答了这个问题。尝试:
// This basically grabs the locale.
string x = MyResource.whatever.... //Whatever it might be.
string locale = x.SubString(x.Length - 5) // Assuming the locale is 5 characters long.
// Now you have a 'locale' that is ready for comparisons.
if (locale == "en-GB") { .... }
if (locale == "fr-FR") { .... }
etc....
在类似的说明中,这是一个有用的两个字母国家代码列表。
http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
我知道这不是真正的正则表达式,但你似乎并不确定是否需要绝对使用它。
答案 5 :(得分:1)
我建议您使用内置的.Net文化支持,即System.Globalization.CultureInfo类,而不是使用Regex;构造函数识别有效的文化字符串,并为您提供可用于特定于文化的操作的对象:
try
{
string fileName = "MyResource.en-GB";
string cultureName = System.IO.Path.GetExtension(fileName).TrimStart('.');
CultureInfo cultureInfo = new CultureInfo(cultureName);
}
catch (ArgumentException)
{
// Invalid culture.
}
答案 6 :(得分:1)
the great answer by Patanjali的扩展,但还包括RFC 4647中定义的命名组和对私人使用的支持。例如:de-DE-x-goethe
或zh-Hant-CN-x-private1-private2
。
^(?<language>[A-Za-z]{2,4})([_-](?<script>[A-Za-z]{4}|[0-9]{3}))?([_-](?<country>[A-Za-z]{2}|[0-9]{3}))?([_-]x[_-](?<private>[A-Za-z0-9-_]+))?$
答案 7 :(得分:0)
这可能不是这个问题的答案,但可能有人路过并在寻找这个答案。
要匹配en_GB
之类的语言环境,可以使用以下表达式:
/^[a-z]{2}_[A-Z]{2}$/
我将在这里尝试进行解释:
^[a-z]
表示以小写字母开头,{2}
表示您恰好希望其中的2个字母
关注_
[A-Z]{2}$
表示以大写字母结尾并与其中的2个完全匹配,$
表示这些字母必须位于字符串的结尾。
答案 8 :(得分:0)
^[a-z]{2}([_])?([A-Za-z]{2})?$
我使用了此正则表达式,它仅适用于具有可选“ _”的语言环境
例如:
zh-,
de,
zh_,
zh_
因此,如果语言环境仅固定了两个字符(仅小写),则正则表达式将起作用 或者它有两个字符(仅小写)+ _ +两个字符(可以大写)