繁体   English   中英

Java正则表达式和替换

[英]Java regex and replacement

嗨,我想了解Java正则表达式替换。 我有很多正则表达式和替换,以应用于文件中的文本。 我想阅读正则表达式并在文本上应用替换。 就像,我想在下面的例子中将text替换为variable

import java.util.regex.*;
public class regex1{
public static void main(String args[]){
    String s1 = "cat catches dog text";
    Pattern p1 = Pattern.compile("\\s*cat\\s+catches\\s*dog\\s+(\\S+)");
    Matcher m1 = p1.matcher(s1);
    if (m1.find()){
        System.out.println(m1.group(1));
        s1 = m1.replaceFirst("variable $1");
        System.out.println(s1);
    }
    else{
        System.out.println("Else");
    }
}    
}

但我输出为

text
variable text

任何人都可以解释组和替换如何在java中工作? 如何获得正确的输出?

使用此代码:

String s1 = "cat catches dog text";
Pattern p1 = Pattern.compile("\\s*cat\\s+catches\\s*dog\\s+(\\S+)");
Matcher m1 = p1.matcher(s1);
if (m1.find()){
    s1 = m1.replaceFirst(s1.substring(0, m1.start(1)) + "variable");
}
else{
    System.out.println("Else");
}
System.out.println(s1);
// cat catches dog variable

试试这个

import java.util.regex.*;
public class regex1{
public static void main(String args[]){
    String s1 = "cat catches dog text";
    Pattern p1 = Pattern.compile("\\s*cat\\s+catches\\s*dog\\s+(\\S+)");
    Matcher m1 = p1.matcher(s1);
    if (m1.find()){
        System.out.println(m1.group(1));
        s1 = s1.replaceFirst(m1.group(1),"variable");
        System.out.println(s1);
    }
    else{
        System.out.println("Else");
    }
}
}

我不完全确定你想做什么。 如果你想在\\\\s*cat\\\\s+catches\\\\s*dog\\\\s+ with variable之后替换单词,那么可以尝试这种方式

String s1 = "cat catches dog text";
Pattern p1 = Pattern.compile("(\\s*cat\\s+catches\\s*dog\\s+)(\\S+)");
Matcher m1 = p1.matcher(s1);
if (m1.find()) {
    System.out.println(m1.group(2));
    s1 = m1.replaceFirst("$1variable");
    System.out.println(s1);
} else {
    System.out.println("Else");
}

现在第1组是(\\\\s*cat\\\\s+catches\\\\s*dog\\\\s+) ,你将它换回$1替换并在最后添加variable

输出:

text
cat catches dog variable

顺便说一下,如果你想使用replaceFirstreplaceAll你不必调用if (m1.find()) 就像使用它一样

String s1 = "cat catches dog text";
Pattern p1 = Pattern.compile("(\\s*cat\\s+catches\\s*dog\\s+)(\\S+)");
Matcher m1 = p1.matcher(s1);
s1 = m1.replaceFirst("$1variable");
System.out.println(s1);

或者如果你不再需要Pattern和Matcher

String s1 = "cat catches dog text";
s1.replaceFirst("(\\s*cat\\s+catches\\s*dog\\s+)(\\S+)","$1variable");

String.replaceFirst有两个参数:正则表达式和替换字符串。

所以在你的例子中替换,

s1 = s1.replaceFirst("variable $1");

s1 = s1.replaceFirst(m1.group(1), "variable");

$1是一种反向引用方法,包括第1( $1 )括号内容。

在您的情况下, $1引用在matcher m1创建的第一个引用。 对“文本”一词的引用。

代码说明

                        referenced by $1
                             ↓↓↓↓
String s1 = "cat catches dog text";
                                                        reference $1
                                                           ↓    ↓
Pattern p1 = Pattern.compile("\\s*cat\\s+catches\\s*dog\\s+(\\S+)");

这里正则表达式的解释。 将鼠标悬停在彩色文本上以获得解释。

重要的是要注意\\S (大写'S')匹配任何非空格字符而+是贪婪的。 这意味着我们得到“在下一个空格之前的所有非空白字符”或简单地说,我们得到了下一个字。

在这种情况下,匹配的单词恰好是“文本”

Matcher m1 = p1.matcher(s1);

m1现在匹配"cat catches dog text"

s1 = m1.replaceFirst("variable $1");

s1设置为s1"cat catches dog text" ),其中m1的第一次出现( '"cat catches dog" followed by any word'的第一次出现'"cat catches dog" followed by any word' )被'"variable" followed by that same word'替换, '"variable" followed by that same word'

如果你真的想要变量替换单词“text”,那么你需要删除$1

s1 = m1.replaceFirst("variable");

s1设置为s1"cat catches dog text" ),其中m1的第一次出现( '"cat catches dog" followed by any word'的第一次出现'"cat catches dog" followed by any word' )被'"variable"'替换

我就是这种情况,你实际上不需要在RegEx模式中包括括号。 如果你不打算回溯,它们没有用(在这种情况下)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM