正则表达式测试词汇零次或多次

时间:2016-06-26 18:27:18

标签: java regex

我想替换" 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不会匹配。

如何将这两种情况合并为一种模式?

2 个答案:

答案 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+个空格(占有量地量化以避免回溯)
  • .*? - 除第一个
  • 之前的换行符以外的0个字符
  • (?=where|$) - where(您可以将其附加\\b)或字符串结尾($)。