我在编写一个验证this现有语言环境的正则表达式时遇到了困难...
到目前为止我所做的是这个正则表达式 ^[a-zA-Z0-9_]{5,10}$
。
但是这个正则表达式有以下语言环境
1 。aa_aa_aaaa
只有第二组字母必须包含2或4个字母。
2 即可。 aaaaa
必须包含至少一个下划线。
任何帮助都很有帮助!谢谢!
答案 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_AA
或aa_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}))?$
希望此正则表达式可能会有所帮助