如何用另一个表达式(字符串)替换字符串中的特定单词,另一个表达式必须获取特定单词的某些部分

时间:2016-01-05 11:12:40

标签: java regex string replace

我有一个字符串

String SQL="SELECT * FROM EMP(SELECT USERNAME FROM EMP WHERE EMPID=100 AND NULLIF(EXP1,EXP2) AND NVL(EXP1,EXP2) AND NVL(EXP3,EXP4)";

在上面的字符串中我有NVL(EXP1,EXP2),我想用这个字符串表达式替换这个字符串
当EXP1为EXPID时为EXP2当EXP1 == 0那么EXP2 ,其中EXP1和EXP2是NVL(EXP1,EXP2)的参数,此参数我想进入替换字符串表达即可。 我正在使用这个RegExp来替换它

  

这是代码

String SQL="SELECT * FROM EMP(SELECT USERNAME FROM EMP WHERE EMPID=100 AND NULLIF(EXP1,EXP2) AND NVL(EXP1,EXP2) AND NVL(EXP3,EXP4)";

  String Pattern   = "(?i)nvl\\(([^\\,)]+),([^\\),]+)\\)";

  String replacement = "CASE WHEN Temp1 IS NULL THEN Temp2 WHEN Temp1 == 0 THEN Temp2";

  SQL = SQL.replaceAll(Pattern, replacement);

  System.out.println(SQL);
  

但替换字符串的Temp1和Temp2我想用NVL的EXP1和EXP2(EXP1,EXP2)替换,因为会有多个具有不同参数的NVL()函数。

我的当前输出是:

SELECT * FROM EMP(SELECT USERNAME FROM EMP WHERE EMPID=100 AND NULLIF(EXP1,EXP2) AND CASE WHEN Temp1 IS NULL THEN Temp2 WHEN Temp1 == 0
 THEN Temp2 AND CASE WHEN Temp1 IS NULL THEN Temp2 WHEN Temp1 == 0 THEN Temp2

我的预期结果:

SELECT * FROM EMP(SELECT USERNAME FROM EMP WHERE EMPID=100 AND NULLIF(EXP1,EXP2) AND CASE WHEN EXP1 IS NULL THEN EXP2 WHEN EXP1 == 0 
THEN EXP2 AND CASE WHEN EXP3 IS NULL THEN EXP4 WHEN EXP3 == 0 THEN EXP4;

请帮我解决这个问题。我被困在这里。

2 个答案:

答案 0 :(得分:3)

使用PatternMatcher,您可以在replaceAll中使用已捕获的群组:

String SQL = "...";

Pattern regex = Pattern.compile("(?i)nvl\\(([^\\,)]+),([^\\),]+)\\)");
Matcher matcher = regex.matcher(SQL);
if(matcher.find()) {
    SQL = matcher.replaceAll("CASE WHEN "
        + matcher.group(3) + " IS NULL THEN " + matcher.group(4)
        + " WHEN " + matcher.group(3)
        + "  == 0 THEN "
        + + matcher.group(4)); // TODO Not exactly what you want, edit it!
}

matcher.group(0)将是整个表达式,matcher.group(1)将是第一个捕获等。

对于这个具体案例,我认为您需要matcher.group(3)matcher.group(4),但我没有对其进行测试。

答案 1 :(得分:2)

Manu的回答非常好,但是我将其更改为使用“正确的”#39;正则表达式组语法,更像是这样:

String SQL = "...";

Pattern regex = Pattern.compile("(?i)nvl\\(([^\\,)]+),([^\\),]+)\\)");
Matcher matcher = regex.matcher(SQL);

String replacement = "CASE WHEN $1 IS NULL THEN $2 WHEN $1 == 0 THEN $2";
String s = matcher.replaceAll(replacement);

这里,1美元和2美元是从原始正则表达式模式中取出的组,您希望在替换中使用它。

这些组由正则表达式中的括号指定,正如Manu所说,$0会为您提供完整匹配的表达式(即NVL(EXP1,EXP2);),$1为您提供第一个表达式括在括号中(即EXP1)和$2给出第二个(EXP2)。