3

Hi I am trying to understand Java regex replacement. I have lots of regex and replacement to apply on text in a file. I want to read regex and apply replacement on text. Like, I want to replace text to variable in following example.

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");
    }
}    
}

But I get output as

text
variable text

Can any one explain how does group and replacement works in java? How to get correct output?

4

5 回答 5

2

使用此代码:

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
于 2013-07-08T18:41:18.900 回答
1

我不完全确定您要做什么。如果你想用之后替换单词\\s*cat\\s+catches\\s*dog\\s+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+),您将其放回替换$1variable在最后添加。

输出:

text
cat catches dog variable

if (m1.find())顺便说一句,如果您想使用replaceFirstor ,您不必调用replaceAll。就像使用它一样

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");
于 2013-07-08T18:39:57.827 回答
1

尝试这个

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");
    }
}
}
于 2013-07-08T18:29:55.000 回答
0

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

所以在你的例子中替换,

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

s1 = s1.replaceFirst(m1.group(1), "variable");
于 2013-07-08T18:24:05.357 回答
0

$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(capital 'S') 匹配任何非空白字符并且 the+是贪婪的。这意味着我们得到“下一个空格之前的所有非空格字符”,或者简单地说,我们得到下一个单词。

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

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') 的第一次出现被替换为'"variable" followed by that same word'

如果你真的想让变量替换“文本”这个词,那么你需要删除$1.

s1 = m1.replaceFirst("variable");

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

我就是这种情况,您实际上也不需要在 RegEx 模式中包含括号。如果您不打算进行反向引用,它们就没有用(在这种情况下)。

于 2013-07-08T19:14:41.903 回答