分隔符后只删除两个括号

时间:2016-10-17 09:10:24

标签: java regex split

我有一个像这样的String java:

String query= Select * from table where date between ('2016-05-03' and '2016-05-04' )

我希望在尝试之后删除括号:

 String search="between";
if(query.toLowerCase().indexOf(search.toLowerCase()) != -1){  
query=query.replaceAll("[()]","");
 }

虽然有效,但如果查询在“'之间”之前或之前包含一些括号它们也会被删除..例如:

SELECT column-names
 FROM table-name1
WHERE value IN (SELECT date 
               FROM table-name2 
              WHERE date between ('2016-05-03' and '2016-05-04' ))

我只想在'之间删除两个第一个括号。得到这个:

 SELECT column-names
 FROM table-name1
WHERE value IN (SELECT date 
               FROM table-name2 
              WHERE date between '2016-05-03' and '2016-05-04') 

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您可以在正则表达式中表示您尝试更改的整个结构:

between\s*\(([^)]*)\)

并将其转换为

between $1

$1是对[^)]*组的引用,其中包含括号的内容。

仅当between后跟一个开括号并且将删除最近的结束括号时,才会进行转换。

See it in action !

答案 1 :(得分:1)

您需要在(之后删除第一个between,并在)之后删除(的最后一个.*。这意味着,您需要利用贪婪匹配.和DOTALL修饰符,以便[^(]*可以匹配换行符号。此外,(可以帮助您抓取between(之间String s = "SELECT column-names\n FROM table-name1\nWHERE value IN (SELECT date \n FROM table-name2 \n WHERE date between ('2016-05-03' and '2016-05-04' ))"; String search="(?s)(between[^(]*)\\((.*)\\)"; System.out.println(s.replaceFirst(search, "$1$2")); 之内的任何内容:

(?s)

请参阅Java demo

<强>详情:

  • (between[^(]*) - 嵌入式DOTALL标志
  • between - 第1组捕获(以外的\\(和0 +字符
  • ( - 匹配(.*)
  • \\) - 在最后一次
  • 之前尽可能多地使用0个字符
  • ) - 文字$1

{1}}对第1组内容的引用,$2对第2组内容的引用。

答案 2 :(得分:1)

我认为下面的代码将解决您的问题:

String query= "Select * from table where date between ('2016-05-03' and '2016-05-04')";
StringBuilder sbr = new StringBuilder(query);
sbr.deleteCharAt(sbr.indexOf("(", sbr.indexOf("between")));
sbr.deleteCharAt(sbr.indexOf(")", sbr.indexOf("between")));
query= sbr.toString();