以更有效的方式替换字符串中的一组子字符串?

Mat*_*t3o 4 java regex string

我要用String中的一组子串替换另一个子串,例如

  1. "^t""\t"
  2. "^=""\u2014"
  3. "^+""\u2013"
  4. "^s""\u00A0"
  5. "^?""."
  6. "^#""\\d"
  7. "^$""[a-zA-Z]"

所以,我试过:

String oppip = "pippo^t^# p^+alt^shefhjkhfjkdgfkagfafdjgbcnbch^";

Map<String,String> tokens = new HashMap<String,String>();
tokens.put("^t", "\t");
tokens.put("^=", "\u2014");
tokens.put("^+", "\u2013");
tokens.put("^s", "\u00A0");
tokens.put("^?", ".");
tokens.put("^#", "\\d");
tokens.put("^$", "[a-zA-Z]");

String regexp = "^t|^=|^+|^s|^?|^#|^$";

StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile(regexp);
Matcher m = p.matcher(oppip);
while (m.find())
    m.appendReplacement(sb, tokens.get(m.group()));
m.appendTail(sb);
System.out.println(sb.toString()); 
Run Code Online (Sandbox Code Playgroud)

但它不起作用.tokens.get(m.group())抛出一个例外.

知道为什么吗?

Uni*_*ron 6

你不必使用HashMap.考虑使用简单数组和循环:

String oppip = "pippo^t^# p^+alt^shefhjkhfjkdgfkagfafdjgbcnbch^";

String[] searchFor =
{"^t", "^=", "^+", "^s", "^?", "^#", "^$"},
         replacement =
{"\\t", "\\u2014", "\\u2013", "\\u00A0", ".", "\\d", "[a-zA-Z]"};

for (int i = 0; i < searchFor.length; i++)
    oppip = oppip.replace(searchFor[i], replacement[i]);

// Print the result.
System.out.println(oppip);
Run Code Online (Sandbox Code Playgroud)

这是一个在线代码演示.


为了完整性,您可以使用二维数组来实现类似的方法:

String oppip = "pippo^t^# p^+alt^shefhjkhfjkdgfkagfafdjgbcnbch^";

String[][] tasks =
{
    {"^t", "\\t"},
    {"^=", "\\u2014"}, 
    {"^+", "\\u2013"}, 
    {"^s", "\\u00A0"}, 
    {"^?", "."}, 
    {"^#", "\\d"}, 
    {"^$", "[a-zA-Z]"}
};

for (String[] replacement : tasks)
    oppip = oppip.replace(replacement[0], replacement[1]);

// Print the result.
System.out.println(oppip);
Run Code Online (Sandbox Code Playgroud)

  • @IanMcLaird` .replaceAll`采用正则表达式.[`.replace()`接受一个字符串,它是字面意思](http://stackoverflow.com/a/25365703/3622940),所以不需要转义. (3认同)
  • @IanMcLaird`replaceAll`使用正则表达式,而OP显然想要替换文字,所以`replace`在这里更好.但是如果循环替换可能存在,例如`a-> b``b-> a`,则可能存在问题.在这种情况下,通过用`b`替换所有`a`然后用`a`替换所有`b`,我们最终只得到`a``appendReplacement`和`appendTail`解决了这个问题. (2认同)

Joo*_*gen 5

在正则表达式中,^意思是"文本开头"(或在字符类中"不"作为否定).你必须在它之前放一个反斜杠,它在java String中变成两个反斜杠.

String regexp = "\\^[t=+s?#$]";
Run Code Online (Sandbox Code Playgroud)

我进一步减少了它.