我有一个像这样的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')
感谢您的帮助
答案 0 :(得分:1)
您可以在正则表达式中表示您尝试更改的整个结构:
between\s*\(([^)]*)\)
并将其转换为
between $1
$1
是对[^)]*
组的引用,其中包含括号的内容。
仅当between
后跟一个开括号并且将删除最近的结束括号时,才会进行转换。
答案 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 +字符(
- 匹配(.*)
\\)
- 在最后一次)
- 文字$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();