Регулярные выражения жадные. То есть они будут соответствовать максимально возможному совпадению. Представьте себе строку, подобную этой:
this_is_a_test
и я хочу первую часть с первым подчеркиванием:
this_is_a_test =~ s/^(.*)_/$1/
Набор скобок будет соответствовать не только this
, но this_is_a_test
, потому что это наибольшее совпадение. Это потому, что я говорю, чтобы все совпадало с подчеркиванием.
Основной способ обойти что-то подобное - исключить персонажа, которого я не хочу. Например:
this_is_a_test =~ s/^([^_]*)_/$1/
Заменяет .*
, который соответствует любой серии символов, на [^ _] *, которая соответствует любой серии символов , за исключением подчеркиваний. Таким образом, вы подходите только до первого подчеркивания.
Фактически, мы могли бы удалить подчеркивание после группировки:
this_is_a_test =~ s/^([^_]*)/$1/
Итак, все, что вам нужно сделать, это изменить свой картограф с:
<mapper type="regexp" from="(.*)_.*(.*)" to="\1.properties\2" />
до
<mapper type="regexp" from="^([^_]*).*\.properties$" to="\1.properties"/>
^([^_]*)
будет соответствовать всему от начала строки до первого подчеркивания. \.properties$
убедится, что имя файла оканчивается на .properties
.
Я не уверен, чем занималась ваша вторая группа. (Вы пытаетесь переместить часть строки после суффикса .properties
?) Вместо этого я просто сделал это, как вы указали в своем первоначальном запросе.