Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用regex将部分结果替换为完整内容?_Java_Regex_Replace - Fatal编程技术网

Java 如何使用regex将部分结果替换为完整内容?

Java 如何使用regex将部分结果替换为完整内容?,java,regex,replace,Java,Regex,Replace,我有一个带有几个步骤的正则表达式和替换例程。它工作正常,我想要的内容被找到并替换。但我不知道如何将部分替换内容设置回完整内容 我想划掉某些标签中的数字,这里是“number”和“otherNumber” String content = "complex content number="456" with many linebreaks\n signal number="123" test otherNumber="A1" endsignal\n more complex conte

我有一个带有几个步骤的正则表达式和替换例程。它工作正常,我想要的内容被找到并替换。但我不知道如何将部分替换内容设置回完整内容

我想划掉某些标签中的数字,这里是“number”和“otherNumber”

String content = "complex content number="456" with many linebreaks\n
   signal number="123" test otherNumber="A1" endsignal\n
   more complex content"; 
结果应该是:

complex content number="456" with many linebreaks\n
signal number="XXX" test otherNumber="XX" endsignal\n
more complex content
请注意,只有特定行中的数字被屏蔽

对于要替换值的行,前面有一个信号字,后面有一个信号字。 使用第一个匹配器
signal.*?endsignal
I提取应该进行替换的行,因为其他行可能包含相同的标记


然后,我仅在该行上使用lookahead
(?您不…直到最后:

    public static void main(String[] args) {
        String content = "complex content number=\"456\" with many linebreaks\n" +
                "signal number=\"123\" test otherNumber=\"XX\" endsignal\n" +
                "more complex content";

        Matcher m = Pattern.compile("signal.*?endsignal").matcher(content);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            String match = m.group(0); // the whole match... including start/end signal.
            match = Pattern.compile("(?<=number=\").*?(\")").matcher(match).replaceAll("XXX");

            m.appendReplacement(sb, match);
        }
        m.appendTail(sb);
        content = sb.toString();       

        System.out.println(content);
    }
publicstaticvoidmain(字符串[]args){
String content=“复杂内容编号=\“456\”带有许多换行符\n+
“信号号=\“123\”测试其他号=\“XX\”结束信号\n”+
“更复杂的内容”;
Matcher m=Pattern.compile(“信号。*?结束信号”).Matcher(内容);
StringBuffer sb=新的StringBuffer();
while(m.find()){
字符串匹配=m.group(0);//整个匹配…包括开始/结束信号。

match=Pattern.compile(“(?我不知道我是否理解正确:你用
XXX
替换了数字,比如说
123
,然后你想要它回来?不,我想设置替换的字符串行
signal number=“XXX”test otherNumber=“XX"endsignal\n
进入
字符串内容
完整内容字符串。因为,在例程结束时,
字符串内容
仍将包含旧的未替换值…在
信号
行中,
数字
其他数字
是必需的吗?它们的顺序是否始终相同?我只想替换数字中的值r标记,如果标记存在,否则不存在。因此,它们可能不被认为是强制性的,而且顺序也不一定相同。Ty这么多,完全符合我的要求。还有一个问题:是否可以获得内部匹配的“大小”,以便我知道匹配了多少个数字/字符,从而知道有多少个“X”为了不改变字符数,我必须更换掩码?这太好了!附带问题:在数字正则表达式中只使用一个匹配组是否会对执行时间产生任何影响?
    public static void main(String[] args) {
        String content = "complex content number=\"456\" with many linebreaks\n" +
                "signal number=\"123\" test otherNumber=\"XX\" endsignal\n" +
                "more complex content";

        Matcher m = Pattern.compile("signal.*?endsignal").matcher(content);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            String match = m.group(0); // the whole match... including start/end signal.
            match = Pattern.compile("(?<=number=\").*?(\")").matcher(match).replaceAll("XXX");

            m.appendReplacement(sb, match);
        }
        m.appendTail(sb);
        content = sb.toString();       

        System.out.println(content);
    }
    private static final Pattern numberpat = Pattern.compile("(?<=number=\")(.+?)(?=\")");
    private static final Pattern linepat = Pattern.compile("signal.*?endsignal");

    public static void main(String[] args) {
        String content = "complex content number=\"456\" with many linebreaks\n" +
                "signal number=\"123\" test otherNumber=\"A2\" endsignal\n" +
                "more complex content";

        Matcher m = linepat.matcher(content);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            String match = m.group(0); // the whole match... including start/end signal.
            m.appendReplacement(sb, "");
            Matcher nmat = numberpat.matcher(match); // note the new regular expression with only one matching group
            while (nmat.find()) {
                nmat.appendReplacement(sb, nmat.group(0).replaceAll(".", "X"));
            }
            nmat.appendTail(sb);
        }
        m.appendTail(sb);
        content = sb.toString();       

        System.out.println(content);
    }