我想替换" table1" to" tableA",所以我写了一个正则表达式来测试sql语句。
String sql1 = "select * from table1";
String sql2 = "select * from table1 where x=123";
String pattern = "from\\s(.*)(where|)";
System.out.println(sql1.replaceFirst(pattern, "from tableA $2"));
System.out.println(sql2.replaceFirst(pattern, "from tableA $2"));
印刷的第一个结果是正确的,但第二次印刷缺少"其中......"
如果我将模式更改为String pattern = "from\\s(.*)(where)";
,没有|,则可以替换sql2,但sql1不会匹配。
如何将这两种情况合并为一种模式?
答案 0 :(得分:0)
在可选(where|)
后面加一个星号。您现在可以忽略模式中的管道符|
String pattern = "from\\s(.*)(where|)\*";
或
String pattern = "from\\s(.*)(where)\*";
答案 1 :(得分:0)
只是为了解决您提供的示例查询的当前问题:|
中的(where|)
替换使匹配where
成为可选项。因此,.*
匹配第一种情况下字符串的其余部分,直到最后一次出现where
(幸运的是,它是第二次查询中唯一的where
。
您可以在此处使用1 +字字符替换from
仅仅是
replaceFirst("from\\s+\\w+", "from tableA")
如果您需要匹配from和第一个where
之间的任何内容或字符串的结尾,您可以使用
replaceFirst("from\\s++.*?(?=where|$)", "from tableA")
,其中
from
- 匹配from
(您可以将其与\\b
括起来以确保整个字匹配)\\s++
- 1+个空格(占有量地量化以避免回溯).*?
- 除第一个(?=where|$)
- where
(您可以将其附加\\b
)或字符串结尾($
)。