Регулярное выражение для соответствия ResourceBundle - PullRequest
2 голосов
/ 20 февраля 2011

Мне нужно регулярное выражение, которое будет соответствовать имени файла 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 ]

2 голосов
/ 02 августа 2011

Это соответствует всем примерам:

^[a-zA-Z\_\.]+[A-Z]{0,2}[a-zA-Z\_\.]*.properties$
1 голос
/ 20 февраля 2011

Вы можете попробовать что-то вроде:

^[a-zA-Z\_\.]+[A-Z]{2}[a-zA-Z\_\.]*.properties$
0 голосов
/ 19 марта 2011

Regex, который я в итоге использовал:

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

Он по-прежнему не соответствует ни одной локали, ни в одной стране, как в bundle_en__Windows.properties, но это лучшее, что я мог придумать.

0 голосов
/ 20 февраля 2011

Это работает для меня:

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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...