如何使用正则表达式分组删除模式的所有实例

时间:2016-09-03 20:10:22

标签: java regex string grouping

我想用“_”

替换请求文本

我想过使用java分组正则表达式语法。但我搞砸了。

这是我的意见:

  

无法处理请求0 [null-> null s:0 w:0.0 a:0.0 S:0 t:24543060   关于主题RealTimeUpdate的s(NA)(0 0)]

预期产出:

  

无法处理主题RealTimeUpdate

上的请求_

b部分

如何在文本中删除此模式的所有实例?

输入:

  

无法处理请求0 [null-> null s:0 w:0.0 a:0.0 S:0 t:24543060   主题RealTimeUpdate上的s(NA)(0 0)]。请求为:0 [null-> null s:0   w:0.0a:0.0 S:0t:24543060s(NA)(0 0)]

预期产出:

  

无法处理主题RealTimeUpdate上的请求_。请求是:_

这是我的尝试:

Pattern p = Pattern.compile("(\"Failed to handle request\")(\\d)("[")(.*)(\"]\")(.*)");
Matcher m = p.matcher(input);
if (m.find()) {
    String output = m.replaceAll("$1"+"$2"+"$3"+"_"+"$5"+"$6"); 
}

如果我承诺该模式以"[null->null"开头:

str.replaceAll((\\d)(\"[null->null\")(*.)(\"]\")", "X");

3 个答案:

答案 0 :(得分:2)

使用零宽度正面观察:

str.replaceAll( "(?<=request )\\d\\[.*?\\]", "_");

答案 1 :(得分:1)

我现在不完全是您的请求语法,但假设它由一个数字后跟括号中的文本组成,您可以使用str = str.replaceAll( "\\d\\[.*?\\]", "_");

答案 2 :(得分:1)

如果要删除Failed to handle requeston subject.*之间的所有内容,您可能确实使用了java regex分组。以下是:

output = input;
Pattern pattern = Pattern.compile("Failed to handle request (.+) on subject.*");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    String request = matcher.group(1);
    output = input.replace(request, "_");
}

更快的是捕获除请求之外的所有内容然后将它们放在一起:

output = input;
Pattern pattern = Pattern.compile("(Failed to handle request ).+( on subject.*)");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    String beforeRequest = matcher.group(1);
    String afterRequest = matcher.group(2);
    output = beforeRequest + "_" + afterRequest;
}

让我们来看看针Pattern

(Failed to handle request ).+( on subject.*)

您可以在此处找到解释:https://regex101.com/r/xB6yW8/1