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#lastIndexOfそしてString#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

String.lastIndexOf()を使用できますか?

于 2012-10-30T12:53:59.093 に答える
0

lastIndexOf()以下のように およびsubstring()関数を使用することができます。

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:replaceAll以下のようにすべての出現箇所を置き換えるために使用)))))) from "stream"ます:

 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 に答える
0

.* は正規表現で貪欲であるため、検索して .* に^(.*\))(.*)置き換え$1 from \"stream\"$2ます。

于 2012-10-30T12:57:47.967 に答える