2012-04-19 3 views
1

Я пытаюсь сопоставить конец слова/строки со следующим выражением: «m [abcd]» и заменить это окончание на другое, похожее на это «? Q», где вопросительный знак соответствует одному из символов a, b, c или d. Проблема в том, что у меня много разных версий. Это пример:Замена конца строки с использованием регулярного выражения

Окончание: м [ABCD]

Replacment: д

Слова: DFMA, ghmc, tdfmd

Желаемый результат: dfaq, ghcq, tdfdq

Как это сделать, используя метод replaceAll для строк в Java или любой другой метод Java? Возможно, я могу сделать это с большим количеством кода, но я прошу более короткое решение. Я не знаю, как подключиться к регулярным выражениям separete.

ответ

2

Если предположить, что строка содержит целое слово:

String resultString = subjectString.replaceAll(
    "(?x)  # Multiline regex:\n" + 
    "m  # Match a literal m\n" + 
    "(  # Match and capture in backreference no. 1\n" + 
    " [a-d] # One letter from the range a through d\n" + 
    ")  # End of capturing group\n" + 
    "$  # Assert position at the end of the string", \ 
    "$1q"); // replace with the contents of group no. 1 + q 

Если строка содержит много слов, и вы хотите найти/заменить их все сразу, а затем использовать \\b вместо $ как по предложению STEMA (в но только в поисковом регулярном выражении, запасная часть должна оставаться равной "$1q").

+1

+1 вы слишком быстро ... но так как он просил «в конце слова/строки» '\ b', вероятно, лучший выбор, чем' '$ – stema

2

Для этого вы можете использовать группу захвата. Напр.

String pattern = "m([abcd])\\b"; //notice the parantheses around [abcd]. 
Pattern regex = Pattern.compile(pattern); 

Matcher matcher = regex.matcher("dfma"); 
String str = matcher.replaceAll("$1q"); //$1 represent the captured group 
System.out.println(str); 

matcher = regex.matcher("ghmc"); 
str = matcher.replaceAll("$1q"); 
System.out.println(str); 

matcher = regex.matcher("tdfmd"); 
str = matcher.replaceAll("$1q"); 
System.out.println(str); 
+0

Вы пропускаете якорь у конец. Это регулярное выражение найдет m [abcd] в любом месте слова. – stema

+0

@stema, спасибо, что указали это. Я отредактировал свой ответ. – Rahul

Смежные вопросы