使用 java 和正则表达式验证字符串语言环境
Validate string locale using java and regex
我在编写验证 this 现有语言环境的正则表达式时遇到困难...
到目前为止我所做的就是这个正则表达式 ^[a-zA-Z0-9_]{5,10}$
.
但是使用此正则表达式可以使用以下语言环境
1.aa_aa_aaaa
只有第二组字母必须包含 2 或 4 个字母。
2。 aaaaa
必须至少包含一个下划线。
非常感谢任何帮助!谢谢!
怎么样:
^(?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_AA
或 aa_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}))?$
希望这个正则表达式能有所帮助
我在编写验证 this 现有语言环境的正则表达式时遇到困难...
到目前为止我所做的就是这个正则表达式 ^[a-zA-Z0-9_]{5,10}$
.
但是使用此正则表达式可以使用以下语言环境
1.aa_aa_aaaa
只有第二组字母必须包含 2 或 4 个字母。
2。 aaaaa
必须至少包含一个下划线。
非常感谢任何帮助!谢谢!
怎么样:
^(?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_AA
或 aa_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}))?$
希望这个正则表达式能有所帮助