Java のパターンとマッチャーを使用して複数の文字列置換を実行しようとしています。正規表現パターンにはメタ文字 (\b、() など) が含まれる場合があります。たとえば、入力文字列のfit i am
場合、置換を適用したいと思います:
\bi\b --> EYE
i --> I
次に、2 つの質問 ( Java 文字列内の複数の異なる部分文字列を一度に置換する、置換テキストが検索テキストと重複する場合に Java で複数の部分文字列を置換する) のコーディング パターンに従いました。両方で、論理和検索パターン (例: foo|bar) と (パターン、置換) のマップを作成し、matcher.find()
ループ内で検索して置換を適用します。
私が抱えている問題は、関数にメタ文字の一致に関する情報が含まれていないため、と をmatcher.group()
区別できないことです。以下のコードを参照してください。問題を解決するにはどうすればよいですか?i
\bi\b
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
public class ReplacementExample
{
public static void main(String argv[])
{
Map<String, String> replacements = new HashMap<String, String>();
replacements.put("\\bi\\b", "EYE");
replacements.put("i", "I");
String input = "fit i am";
String result = doit(input, replacements);
System.out.printf("%s\n", result);
}
public static String doit(String input, Map<String, String> replacements)
{
String patternString = join(replacements.keySet(), "|");
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);
StringBuffer resultStringBuffer = new StringBuffer();
while (matcher.find())
{
System.out.printf("match found: %s at start: %d, end: %d\n",
matcher.group(), matcher.start(), matcher.end());
String matchedPattern = matcher.group();
String replaceWith = replacements.get(matchedPattern);
// Do the replacement here.
matcher.appendReplacement(resultStringBuffer, replaceWith);
}
matcher.appendTail(resultStringBuffer);
return resultStringBuffer.toString();
}
private static String join(Set<String> set, String delimiter)
{
StringBuilder sb = new StringBuilder();
int numElements = set.size();
int i = 0;
for (String s : set)
{
sb.append(Pattern.quote(s));
if (i++ < numElements-1) { sb.append(delimiter); }
}
return sb.toString();
}
}
これは出力します:
match found: i at start: 1, end: 2
match found: i at start: 4, end: 5
fIt I am
理想的には、そうあるべきですfIt EYE am
。