2

我需要一个与 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*)?匹配一个或不匹配一个变体。

知道如何修复和/或改进这个正则表达式吗?

4

4 回答 4

2

这与所有示例匹配:

^[a-zA-Z\_\.]+[A-Z]{0,2}[a-zA-Z\_\.]*.properties$
于 2011-08-02T18:38:26.243 回答
1

您可以尝试以下方法:

^[a-zA-Z\_\.]+[A-Z]{2}[a-zA-Z\_\.]*.properties$
于 2011-02-20T04:50:04.543 回答
0

我最终使用的正则表达式:

^[a-zA-Z.]+(_([a-z]{2}(_[A-Z]{0,2})?|[a-z]{0,2}(_[A-Z]{2})?){1}(_\w*)?)\.properties$

它仍然与没有国家/地区的语言环境部分不匹配,例如bundle_en__Windows.properties,但这是我能想到的最好的。

于 2011-03-19T20:30:22.453 回答
0

这对我有用:

public class Test {

  public static void main(String[] args) {
    String regex = "^[a-zA-Z]+(_)([a-z]{2})?(_)?([A-Z]{2})(_)?(\\w*)(\\.properties)$";

    assert "bundle.properties".matches(regex) == false;               // false - correct
    assert "bundle_.properties".matches(regex) == false;              // false - correct
    assert "bundle_en.properties".matches(regex) == false;            // false!
    assert "bundle__US.properties".matches(regex) == true;           // true - correct
    assert "bundle_en_US.properties".matches(regex) == true;         // true - correct
    assert "bundle_en__Windows".matches(regex) == false;             // false!
    assert "bundle__US_Windows.properties".matches(regex) == true;   // true - correct
    assert "bundle_en_US_Windows.properties".matches(regex) == true; // true - correct
  }
}
于 2011-02-20T05:32:25.890 回答