Мне нужно регулярное выражение, которое будет соответствовать имени файла 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*)?
соответствует одному или отсутствию варианта.
Есть идеи, как исправить и / или улучшить это регулярное выражение?