Java替换除指定的正则表达式之外的所有正则表达式

Java替换除指定的正则表达式之外的所有正则表达式,java,regex,string,Java,Regex,String,我已经有很长一段时间不知道该怎么办了。我有一段代码: getStringFromDom(doc).replaceAll("contract=\"\\d*\"|name=\"\\p{L}*\"", ""); 基本上,我需要它以相反的方式工作——替换除指定正则表达式之外的所有内容。我一直试图用消极的前瞻性来做这件事,但没有任何效果。我想,对于你的特殊任务 getStringFromDom(doc).replaceAll(".*?(contract=\"\\d*\"|name=\"\\p{L}*\"

我已经有很长一段时间不知道该怎么办了。我有一段代码:

getStringFromDom(doc).replaceAll("contract=\"\\d*\"|name=\"\\p{L}*\"", "");

基本上,我需要它以相反的方式工作——替换除指定正则表达式之外的所有内容。我一直试图用消极的前瞻性来做这件事,但没有任何效果。

我想,对于你的特殊任务

getStringFromDom(doc).replaceAll(".*?(contract=\"\\d*\"|name=\"\\p{L}*\").*", "$1");

你应该做你需要做的事。

我想是为了你的特殊任务

getStringFromDom(doc).replaceAll(".*?(contract=\"\\d*\"|name=\"\\p{L}*\").*", "$1");

应该执行您需要的操作。

您希望删除与模式不匹配的所有内容。这与简单地过滤模式匹配相同。使用正则表达式查找该模式的匹配项,然后在stringbuilder中收集匹配项

Matcher m=Pattern.compile(你的模式).Matcher(你的输入);
StringBuilder sb=新的StringBuilder();
而(m.find())sb.append(m.group()).append('\n');
字符串结果=sb.toString();

您希望删除与模式不匹配的所有内容。这与简单地过滤模式匹配相同。使用正则表达式查找该模式的匹配项,然后在stringbuilder中收集匹配项

Matcher m=Pattern.compile(你的模式).Matcher(你的输入);
StringBuilder sb=新的StringBuilder();
而(m.find())sb.append(m.group()).append('\n');
字符串结果=sb.toString();

我还认为,删除您不需要的内容是一种双重否定。专注于你正在寻找的东西,并为此使用模式匹配。此示例在文档中搜索任何名称属性:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String input = "<AnotherDoc accNum=\"1111\" docDate=\"2017-09-26\" docNum=\"2222\" name=\"foo\"> <anotherTag>some date</anotherTag>";

        Pattern pattern = Pattern.compile("name=\"[^\\\"]*\""); // value are all characters but "
        Matcher matcher = pattern.matcher(input);

        while (matcher.find())
            System.out.println(matcher.group());
    }
}

我还认为,去掉你不想要的东西是一种双重否定。专注于你正在寻找的东西,并为此使用模式匹配。此示例在文档中搜索任何名称属性:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String input = "<AnotherDoc accNum=\"1111\" docDate=\"2017-09-26\" docNum=\"2222\" name=\"foo\"> <anotherTag>some date</anotherTag>";

        Pattern pattern = Pattern.compile("name=\"[^\\\"]*\""); // value are all characters but "
        Matcher matcher = pattern.matcher(input);

        while (matcher.find())
            System.out.println(matcher.group());
    }
}

请提供示例文本和预期输出。现在,这听起来好像是您所需要的一切。我有一个xml,比如说某个日期等。我需要写入一个文件“name=“foo”,没有其他东西最好不要使用Matcher为什么不使用
Matcher
如果引擎无论如何都使用它呢?因为您的输入是xml,所以使用xml解析器会更明智。JAXP在JRE中。Jackson是一个程序员友好的选择。@WiktorStribiżew没有理由不使用Matcher,我可能现在就用它,replaceAll在这里感觉不对。我有点累了,所以我只想使用我已经开始工作的解决方案。请提供示例文本和预期输出。现在,这听起来好像是您所需要的一切。我有一个xml,比如说某个日期等。我需要写入一个文件“name=“foo”,没有其他东西最好不要使用Matcher为什么不使用
Matcher
如果引擎无论如何都使用它呢?因为您的输入是xml,所以使用xml解析器会更明智。JAXP在JRE中。Jackson是一个程序员友好的选择。@WiktorStribiżew没有理由不使用Matcher,我可能现在就用它,replaceAll在这里感觉不对。我有点累了,所以我只想使用我已经开始使用的解决方案。如果同时有
合同
名称
属性,这种方法将不起作用,因为它将删除1个属性。它确实起作用,但只在一行上,是否有办法替换所有其他属性?如果同时存在
合同
名称
属性,则此方法将不起作用,因为它将删除1个属性。它确实起作用,但仅在一行上,是否有办法替换所有其他属性?这是正确的,不过,我采用了Wiktor Stribiżew的解决方案,并对其进行了轻微修改。Matcher绝对是我想在这里使用的。这是对的,不过我采用了Wiktor Stribiżew的解决方案,并对其进行了轻微修改。Matcher绝对是我想要在这里使用的。