【问题标题】:How can i replace particular word from a string with another expression(string) and the another expression has to get some part of particular word如何用另一个表达式(字符串)替换字符串中的特定单词,而另一个表达式必须获取特定单词的某些部分
【发布时间】:2026-02-04 21:00:02
【问题描述】:

我有一个字符串

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),我想用这个字符串表达式替换这个字符串
CASE WHEN EXP1 IS NULL THEN EXP2 WHEN EXP1== 0 THEN 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;

请帮我解决这个问题。我卡在这里了。

【问题讨论】:

  • @sidgate: 如何用当前字符串参数替换替换字符串,能否请您提供一些代码示例。

标签: java regex string replace


【解决方案1】:

使用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) 来处理这种特定情况,但我没有测试它。

【讨论】:

    【解决方案2】:

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

    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 给你括号中的第一个表达式(即@ 987654325@) 和 $2 给出第二个 (EXP2)。

    【讨论】:

    • 哦,这确实更容易。请注意,如果您想对捕获的组进行更多字符串操作,您将需要我的解决方案,正如我最近需要的那样:-)
    • @Davey:我有类似的要求,比如我有函数 POSITION('STR' IN STRING)。我想知道正则表达式模式,它可以给我这个输出: INSTR(STRING,'STR ')。注意STR,它可以是单引号或双引号,STRING应该被替换,因为它来自POSITION函数。STR和STRING是来自用户的动态输入。
    • @sander,这似乎是一个足够不同的场景来保证一个新问题,而且作为一个问题,您将能够以更清晰的方式对其进行格式化。
    最近更新 更多