我有一个字符串如下。
$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"
请提供一些指导来实现同样的目标。
答案 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"