使用java和regex验证字符串语言环境

时间:2015-01-14 13:54:29

标签: java regex

我在编写一个验证this现有语言环境的正则表达式时遇到了困难...

到目前为止我所做的是这个正则表达式 ^[a-zA-Z0-9_]{5,10}$

但是这个正则表达式有以下语言环境

1 aa_aa_aaaa只有第二组字母必须包含2或4个字母。

2 即可。 aaaaa必须包含至少一个下划线。

任何帮助都很有帮助!谢谢!

4 个答案:

答案 0 :(得分:2)

怎么样:

^(?i)[a-z]{2}_(?:[a-z]{2}){1,2}(?:_[a-z]{2})?$

其中(?i)不区分大小写。

答案 1 :(得分:2)

您应该稍微更改表达式以添加其他约束。

基本上你有这个:

^[a-z]{2}(_([a-zA-Z]{2}){1,2})?_[A-Z]{2}$

这将匹配aa_AAaa_aAaa_AA格式的区域设置,即至少需要两个双字母组和一个可选的2或4个字母组(组必须包含一个或两个2个字母的子组)。

请注意,我使表达式区分大小写,即第一个2个字母的组需要为小写,最后一个(第二个或第三个)组必须为大写,如您发布的列表所暗示的那样。可选的4个字母组将允许两种情况。

如果您不希望表达式只是在表达式前面的(?i)处区分大小写。

但是,这只是检查潜在的Locale id的格式。您仍然不知道该ID是否实际受支持。因此,您可以跳过该步骤,并使用可用语言环境中的该ID查找语言环境。我不确定是否有任何内置功能,但您可以创建Locale.getAvailableLocales()的地图,其中密钥是Locale#toString()返回的ID,然后使用该地图进行查找。

答案 2 :(得分:0)

这里是toString()版的正则表达式,例如java.util.Locale

在大多数情况下,您可能会满意

  • 语言和国家/地区
^(?i)(?<lang>[a-z]{2,8})(?:_(?<country>(?:[a-z]{2})|(?:[0-9]{3})))?$
  • 语言,脚本,国家/地区
^(?i)(?<lang>[a-z]{2,8})(?:_(?<script>[a-z]{4})_)?(?:_(?<country>(?:[a-z]{2})|(?:[0-9]{3})))?$
  • 语言,脚本,国家/地区,变体
^(?i)(?<lang>[a-z]{2,8})(?:_(?<script>[a-z]{4})_)?(?:_(?<country>(?:[a-z]{2})|(?:[0-9]{3})))?(?:_(?<variant>(?:(?:[0-9][0-9a-z]{3})|(?:[0-9a-z]{5,8}))(?:(?:_|-)(?:(?:[0-9][0-9a-z]{3})|(?:[0-9a-z]{5,8})))*))?$

*此模式不会提取单独的subtags-不要认为有用例可以使它们一一对应。

  • 语言,脚本,国家/地区,变体,扩展名
...gets too long and ugly )

这些表单在更符合规范的部分(例如正则表达式组)之间接受_(下划线)。

如果还允许通行证-(连字符),例如java.util.Locale中允许的通行证,则不会再次使模式更漂亮。 为实现这一目标,您可以用-之类的东西代替(?:_|-),但总的来说,我喜欢强调并鼓励人们使用它们。

此外,它也更符合«IETF BCP 47,它由RFC 4647“语言标记的匹配”和RFC 5646“识别语言的标记”组成,仅接受_(下划线)。 / p>

答案 3 :(得分:0)

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

希望此正则表达式可能会有所帮助