gpt4 book ai didi

java - 使用元字符正则表达式模式执行多个字符串替换

转载 作者:行者123 更新时间:2023-12-01 05:19:47 27 4
gpt4 key购买 nike

我正在尝试使用 Java 的模式和匹配器执行多个字符串替换,其中正则表达式模式可能包含元字符(例如\b、() 等)。例如,对于输入字符串 fit i am,我想应用替换:

\bi\b --> EYE
i --> I

然后我遵循两个问题的编码模式( Java Replacing multiple different substring in a string at onceReplacing multiple substrings in Java when replacement text overlaps search text )。在这两种情况下,他们都会创建一个 or'ed 搜索模式(例如 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

最佳答案

您输错了一个正则表达式:

    replacements.put("\\bi\\", "EYE"); //Should be \\bi\\b
replacements.put("i", "I");

您可能还想让您的正则表达式独一无二。 map.getKeySet() 无法保证顺序,因此它可能只是在检查 \\bi\\b 之前将 i 替换为 I。

关于java - 使用元字符正则表达式模式执行多个字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606356/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com