regex 是否有正则表达式来测试字符串是否用于区域设置?[已关闭]

a2mppw5e  于 2023-10-22  发布在  其他
关注(0)|答案(9)|浏览(123)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

4年前关闭。
Improve this question
我对正则表达式一无所知,但我想我必须用它来解决我的问题,我得到了一些文件名,看起来像:

MyResource
MyResource.en-GB
MyResource.en-US
MyResource.fr-FR
MyResource.de-DE

这个想法是测试我的字符串是否以“[letter][letter]-[letter][letter]”结尾
我知道这是一个非常noob,但我只是不知道如何做到这一点,即使我知道我到底想做什么...:(

62lalag4

62lalag41#

为了满足基本变量:

^[A-Za-z]{2,4}([_-][A-Za-z]{4})?([_-]([A-Za-z]{2}|[0-9]{3}))?$

其中包括:
1.语言代码:ISO 639 2或3,或4以备将来使用,alpha。
1.可选脚本代码:ISO 15924 4 α。
1.可选国家代码:ISO 3166-1 2字母或3位数字。
1.用下划线或破折号分隔。
有效示例如下:

  • de
  • en-US
  • zh-Hant-TW
  • 恩奥
  • aZ_cYrl-aZ。

对于OP的特定问题,这需要以/^MyResource[.]为前缀,以$/为后缀,以确保整个文件名是以区域设置结尾的有效资源文件。
请注意,某些编程语言的函数可能只接受特定的形式,如下划线和国家代码。PHP的intl函数接受大小写和分隔符。PayPal只接受语言或la_CY表格,其中la是语言,CY是国家/地区。可以使用PHP locale_canonicalize函数转换为这种格式。
IETF RFC 5646管理这些标签的互联网使用,推荐了一种大写和分隔格式,如az-Cyrl-AZ,如上面的前三个例子中所使用的,尽管它说处理器应该接受任何大小写和分隔符的混合,如最后两个例子。当显示区域设置时,使用-作为分隔符允许更细粒度的换行,否则可能会像使用非换行_时那样产生明显的空行,特别是在表格单元格中。
推荐的基本格式的正则表达式是:

^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$

regexp只包含基本格式。临时演员也有不同的版本,比如当地的。RFC 5646允许这样的变体,沿着有私有扩展和向后兼容形式。这完全取决于所需的粒度。PHP的intl函数和其他程序使用的CLDR Unicode数据库可能会在不同版本中包含这些变体,尽管它们也可能在以后消失。
如果使用基于CLDR的函数集,如PHP的intl扩展,则可以使用以下函数检查intl数据库中是否存在区域设置:

<?php
 function is_locale($locale=''){
  // STANDARDISE INPUT
  $locale=locale_canonicalize($locale);
  
  // LOAD ARRAY WITH LOCALES
  $locales=resourcebundle_locales('');
  
  // RETURN WHETHER FOUND
  return (array_search($locale,$locales)!==F);
 }
?>

加载和搜索数据大约需要半毫秒的时间,因此不会对性能造成太大影响。
当然,它只会在随所用PHP版本提供的CLDR版本的数据库中找到这些数据,但会随每个后续PHP版本更新。
请注意,有些区域设置不是针对国家,而是地区,这些通常是数字,如001代表“世界”,150代表“欧洲”,419代表“拉丁美洲”。所以现在有en-001en-150ar-001es-419,它们可以用于泛型语言。例如,en-001被设计为解耦对en-us的依赖,特别是因为它的日期格式和拼写与其他100个地区性的en变体完全不同。en-150区域设置与en-001相同,除了编号分隔符和其他特定于欧洲的格式。
一般来说,regexp是一种很好的前端健全性检查,可以过滤掉非法字符,特别是保留格式以备将来添加。它还有助于防止恶意字符组合被发送到查找工具,特别是在使用基于文本的查找命令机制(如SQL或XPath)的情况下。

3htmauhk

3htmauhk2#

这将测试您的输入:

\.[a-z]{2}-[A-Z]{2}$

这真的很字面:“匹配一个点(\.,点号是正则表达式中的特殊字符),后跟从az的任意两个字符([a-z]{2}--[...]是一个字符类),后跟一个破折号(-),后跟两个从AZ的任意字符([A-Z]{2}),后跟输入结束($)。
http://www.dotnetperls.com/regex-match <--如何在C#中对输入应用此正则表达式。这意味着代码看起来像(未经测试):

// Post edit: this will really return a boolean
if (Regex.Match(input, @"\.[a-z]{2}-[A-Z]{2}$").Success) {
    // there is a match
}

http://regex.info <--购买并阅读它,它是宇宙中最好的正则表达式资源
http://regular-expressions.info <--第二好的资源

uyto3xhc

uyto3xhc3#

与其使用Regex,我建议您使用.Net中内置的对区域性的支持,即System.Globalization.CultureInfo类;构造函数识别有效的区域性字符串,并为您提供可用于区域性特定操作的对象:

try
{
    string fileName = "MyResource.en-GB";
    string cultureName = System.IO.Path.GetExtension(fileName).TrimStart('.');
    CultureInfo cultureInfo = new CultureInfo(cultureName);
}
catch (ArgumentException)
{
    // Invalid culture.
}
2o7dmzc5

2o7dmzc54#

你可以试试这样的东西:
[a-z]{2}-[a-z]{2}

mctunoxg

mctunoxg5#

你几乎在问题中回答了。试试看:

// 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
我知道这不是真正的正则表达式,但你似乎并不确定绝对需要使用它。

g9icjywg

g9icjywg6#

cultures = CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures);
cultures.Where(o => filename.EndsWith(o.Name));
5tmbdcev

5tmbdcev7#

这可能不是这个问题的答案,但人们可能会路过并寻找这个答案。
要匹配像en_GB这样的语言环境,可以使用以下表达式:
/^[a-z]{2}_[A-Z]{2}$/
我会在这里解释一下:
^[a-z]意味着以小写字母开头,{2}意味着您希望正好有两个这样的字母
然后是_
[A-Z]{2}$表示以大写字母结尾,并且恰好匹配其中的两个,$表示这些字母必须位于字符串的末尾。

nbysray5

nbysray58#

the great answer by Patanjali的扩展,但也包括命名组和对RFC 4647中定义的私有使用的支持。举例来说:de-DE-x-goethezh-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-_]+))?$
avkwfej4

avkwfej49#

^[a-z]{2}([_])?([A-Za-z]{2})?$

我使用了这个正则表达式,它适用于只有可选'_'的locale。
嗯,
de,
en_us,
简体中文
所以Regex在语言环境只有固定的两个字符(只有)或者它有两个字符(只有)+ _ +两个字符(可以是)的情况下工作。

相关问题