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

标签 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),我想用这个字符串表达式替换这个字符串
CASE WHEN EXP1 IS NULL THEN EXP2 WHEN EXP1== 0 THEN EXP2 其中 EXP1 和 EXP2 是 NVL(EXP1,EXP2) 的参数,这个参数我想进入替换字符串表达。 我正在使用这个 RegExp 来替换它

Here is the Code

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);

but Temp1 and Temp2 of replacement string i want to replace with EXP1 and EXP2 of NVL(EXP1,EXP2) because there will be number of NVL() functions with different arguments.

我当前的输出是:

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;

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

最佳答案

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

关于java - 我如何用另一个表达式(字符串)替换字符串中的特定单词,而另一个表达式必须获取特定单词的某些部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34610312/

相关文章:

PHP 对象索引作为字符串?

php - 如何在php中获取字符串中最后一个字母的位置?

python - 如何让字符串列的所有包含匹配项?

java - Android 中线程的实现不起作用

Java:InputStream read() 返回一个大于 127 的字节?

正则表达式删除嵌套的括号

c# - 查找可以用给定字母集拼写的单词集

java - 我如何为在 MySQL 数据库中保存自身实例的 Java 对象建模?

java - 如何将 java webstart 与 RMI 混合使用?

javascript - javascript中的上限十进制格式