我需要一个与 a 的文件名匹配的正则表达式ResourceBundle
,它遵循格式name_lo_CA_le.properties
. 它应该只匹配在其文件名中具有区域设置部分的包,并且名称部分不应有下划线。
经过数小时的实验,我想出了以下几点:
^[a-zA-Z]+(_([a-z]{2}(_[A-Z]{0,2})?|[a-z]{0,2}(_[A-Z]{2})?){1}(_\\w*)?){1}\\.properties$
它似乎不适用于所有情况:
"bundle.properties".match(...); // false - correct
"bundle_.properties".match(...); // false - correct
"bundle_en.properties".match(...); // true - correct
"bundle__US.properties".match(...); // true - correct
"bundle_en_US.properties".match(...); // true - correct
"bundle_en__Windows.properties".match(...); // false!
"bundle__US_Windows.properties".match(...); // true - correct
"bundle_en_US_Windows.properties".match(...); // true - correct
我完全不知道如何从这里开始。这是我在括号部分背后的推理:
(...){1}
完全匹配一个语言环境部分。
(_([a-z]{2}(_[A-Z]{0,2})?|[a-z]{0,2}(_[A-Z]{2})?){1}
完全匹配一个两个字符的语言代码和一个可能为零且最多两个字符的国家代码或相反的方式。
(_\\w*)?
匹配一个或不匹配一个变体。
知道如何修复和/或改进这个正则表达式吗?