0

我有一个字符串如下。

   $x:Test( (x==5 || y==4) && ( (r==9 || t==10) && ( n>=2 || t<=4))) demo program 

在上面的字符串中,左右括号的数量将根据条件进行更改。

我的要求是每当我遇到最后一个右括号时,就需要连接下面的字符串。

 from "stream"

所以结果如下。

$x:Test( (x==5 || y==4) && ( (r==9 || t==10) && ( n>=2 || t<=4))) from "stream" demo program 

为了实现这一点,我正在尝试使用 java 中的以下代码。

Pattern pattern = Pattern.compile(".*?\\.Event\\(([^\\(]*?|\\([^\\)]*?\\))*\\)");

if(line.matches(".*\\.Test(.*).*")){
    line = pattern.matcher(line).replaceAll("$0 from  \""+"stream"+"\""+" ");                 
}

但是如果左右括号的数量超过 5 ,上面的代码就不起作用。

需要指针来实现所需的结果我的意思是我需要任何数量的左右括号的通用解决方案。

4

5 回答 5

5

为什么要使用正则表达式?只需使用简单的String类方法 -String#lastIndexOfString#substring解决问题: -

String str = "$x:Test( (x==5 || y==4) && ( (r==9 || t==10) && " + 
             "( n>=2 || t<=4))) demo program";

int index = str.lastIndexOf(")");
str = str.substring(0, index + 1) + " from \"stream\"" + 
      str.substring(index + 1);

Regexp是一种非常强大的语言,但对于这样的事情实际上并不需要,您可以确定需要在哪里拆分字符串。

于 2012-10-30T12:53:01.927 回答
1

要在最右边的括号之后获得它,您可以replaceFirst()像这样使用:

String data = "   $x:Test( (x==5 || y==4) && ( (r==9 || t==10) && ( n>=2 || t<=4))) demo program ";
data = data.replaceFirst("^(.*\\))([^)]*)$", "$1 from \"stream\"$2");
于 2012-10-30T12:55:30.533 回答
0

.* 在正则表达式中是贪婪的,因此搜索^(.*\))(.*)并替换为$1 from \"stream\"$2.

于 2012-10-30T12:57:47.967 回答
0

你可以使用String.lastIndexOf()吗?

于 2012-10-30T12:53:59.093 回答
0

You may want to use lastIndexOf() and substring() functions as below:

String text = 
  "$x:Test( (x==5 || y==4) && ( (r==9 || t==10) && ( n>=2 || t<=4))) demo program";

int lastIndex = text.lastIndexOf(")");
String updatedText = 
        text.substring(0,lastIndex)+" from \"stream\""+text.substring(lastIndex+1);

EDIT: use replaceAll to replace all occurrences of ))) with ))) from "stream" as below:

 String text = 
  "$x:Test( (x==5 || y==4) && ( (r==9 || t==10) && ( n>=2 || t<=4))) demo program";

 String updatedText = text.replaceAll("\\)\\)\\)", "\\)\\)\\) from \"stream\"");
于 2012-10-30T12:56:18.690 回答