如何使用java使用正则表达式替换特定的子串?

时间:2011-09-29 15:04:58

标签: java

我有一个字符串如下。

$Trap:com.oss.Event(description  matches  "abc") 

在上面的字符串中,通用部分是$Trap:com.oss.Event(<Any string>)

当我遇到上面的字符串时,我需要用下面的字符串替换。

$Trap:com.oss.Event(description  matches  "abc") from entry-point "EventStream".

为了实现上述目的,我在java中使用了以下逻辑。

String stmt= $Trap:com.oss.Event(description  matches  "abc")

if(stmt.matches(".*\\.Event(.*).*")&& s.equals(""))
{
                stmt+=" from entry-point "+"ABCStream";
}

但是当字符串如下所示时,上述逻辑没有按预期工作。

stmt="$Trap:com.oss.Event(description matches "abc") or $Trap:com.oss.Event(description matches  "cde");

我需要使用正则表达式生成以下相应的字符串。

$Trap:com.oss.Event(description matches "abc") from entry-point "ABCStream" or $Trap:com.oss.Event(description matches  "cde") from entry-point "ABCStream"

请提供一些指导来实现同样的目标。

2 个答案:

答案 0 :(得分:2)

以下Java代码有效:

String stmt = "$Trap:com.oss.Event(description matches \"abc\")"
   + " or $Trap:com.oss.Event(description matches  \"cde\")";

Pattern p = Pattern.compile(".*?\\.Event\\(.*?\\)");
String res = p.matcher(stmt).replaceAll("$0 from entry-point \"ABCStream\"");

System.err.println(res);

并产生以下结果:

$Trap:com.oss.Event(description matches "abc") from entry-point "ABCStream" or $Trap:com.oss.Event(description matches  "cde") from entry-point "ABCStream"

你需要引用特殊的字符,例如圆括号,里面正则表达式,也使用懒惰匹配,即*?。 $ 0指的是找到的匹配组。

如果您反复进行此替换,使用Pattern.compile()将为您节省一些性能。

答案 1 :(得分:2)

这样做:

public class A {
    public static void main(String[] args) {
        String stmt="$Trap:com.oss.Event(description matches \"abc\") or $Trap:com.oss.Event(description matches  \"cde\")";
        System.out.println(stmt);
        System.out.println(stmt.replaceAll("(\\$Trap:com.oss.Event\\([^)]*\\))", "$1 from entry-point \"ABCStream\""));
    }
}

如您所见,您必须双重逃避某些符号。第一个和最后一个括号用于对正则表达式进行分组,您可以使用“$ 1”打印该组

并推测出这个输出:

$Trap:com.oss.Event(description matches "abc") or $Trap:com.oss.Event(description matches  "cde")
$Trap:com.oss.Event(description matches "abc") from entry-point "ABCStream" or $Trap:com.oss.Event(description matches  "cde") from entry-point "ABCStream"