我需要一个与 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}
与两个字符的语言代码和可能为零且最多 2 个字符的国家/地区代码之一完全匹配,或者反之亦然。
(_\\w*)?
匹配一个变体或不匹配任何变体。
知道如何修复和/或改进这个正则表达式吗?
最佳答案
这与所有示例匹配:
^[a-zA-Z\_\.]+[A-Z]{0,2}[a-zA-Z\_\.]*.properties$
关于java - 正则表达式匹配 ResourceBundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055249/