我正在尝试使用以下表达式匹配单词/字符串的结尾:“m [abcd]”并将此结尾替换为另一个看起来像这样的“?q”,其中问号与其中一个匹配字符a,b,c或d。问题是,我有很多不同的结局。这是一个例子:
结束:m [abcd]
替换:?q
单词:dfma,ghmc,tdfmd
期望的结果:dfaq,ghcq,tdfdq
如何使用Java中的Strings的replaceAll方法或任何其他Java方法来执行此操作?也许我可以用很多代码来制作它,但我要求更短的解决方案。我不知道如何连接到separete正则表达式。
答案 0 :(得分: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
如果您的字符串包含多个字词,并且您希望一次查找/替换所有字词,则根据stema的建议使用\\b
而不是$
(但仅限于搜索正则表达式;替换部分需要保留为"$1q"
)。
答案 1 :(得分: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);