使用 java 和正则表达式验证字符串语言环境

Validate string locale using java and regex

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

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

但是使用此正则表达式可以使用以下语言环境

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

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

非常感谢任何帮助!谢谢!

怎么样:

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

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

您应该稍微更改一下表达式以添加这些额外的约束。

基本上你会有这个:

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

这将匹配 aa_AAaa_aAaa_AA 格式的语言环境,即至少需要两个 2 字母组和一个可选的 2 或 4 字母组(组必须包含一个 1 或 2 个 2 字母子组)。

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

如果您不需要表达式区分大小写,只需在表达式前面的 (?i) 即可。

但是,这只是检查潜在区域设置 ID 的格式。您仍然不知道该 ID 是否真的受支持。因此,您可以跳过该步骤并从可用语言环境中查找具有该 id 的语言环境。我不确定是否有任何内置功能,但您可以创建一个 Locale.getAvailableLocales() 的映射,键是 Locale#toString() 返回的 id,然后使用该映射进行查找。

这是 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 "Matching of Language Tags" 和 RFC 5646 "Tags for Identifying Languages" 组成,仅接受 _(下划线)。

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

希望这个正则表达式能有所帮助