Regex用于匹配的文本,后跟文本,直到除匹配的左括号外的括号闭合

  • 本文关键字:文本 用于 Regex regex regex-recursion
  • 更新时间 :
  • 英文 :


如果问题混淆了,很抱歉。从下面的文本

value = ( select max( tbl.column_name ) from table tbl where trim(colum2)='value1'
and (trim((colum3)))='value3')

我想要低于的输出

select max( tbl.column_name ) from table tbl where trim(colum2)='value1'
and (trim((colum3)))='value3'

基本上从select max(till(except开始(匹配一个左括号。

(select[ ]*max[ ]*(.*column_name[ ]*)[^)]*)

这只匹配到修剪(第2列需要帮助逃离括号(是否有一个包括任何嵌套的开放括号

感谢

编辑:我终于用java完成了,如下所示。但想知道REGEX解决方案

String sql = readFile(file.getPath());
Pattern patTabs = Pattern.compile("(\([ n]*SELECT[ n]*MAX[ n]*\(.*COLUMN_NAME[ n]*\))", Pattern.CASE_INSENSITIVE);
Matcher tabMat = patTabs.matcher(sql);
while (tabMat.find()) {
int i = tabMat.start();
int j = tabMat.end();
int l = 0;
for (j = tabMat.end(); j < sql.length(); j++) {
char k = sql.charAt(j);
if (k == '(') {
l++;
}
if (k == ')') {
if (l == 0) {
break;
} else {
l--;
}
}
}
System.out.println(sql.substring(i, j + 1))
}

如果您想要一个优雅的解决方案,就必须将这些表达式中的行终止符替换为空白。所以你需要改变这个-

value = ( select max( tbl.column_name ) from table tbl where trim(colum2)='value1'
and (trim((colum3)))='value3')

到这个-

value = ( select max( tbl.column_name ) from table tbl where trim(colum2)='value1' and (trim((colum3)))='value3')

编辑:之后,您可以使用( *?(select *?max( .*?column_name *?).+) *?)来匹配您期望的表达式。

这是的现场演示

如果您真的不想替换表达式中的行终止符,而是想使用

value = ( select max( tbl.column_name ) from table tbl where trim(colum2)='value1'
and (trim((colum3)))='value3')

可以使用此([ n]*?(select[ n]*?max([ n].*?column_name[ n])[Dd n]+)[ n]*?)。但我强烈建议不要这样做,因为如果将多个value = ( select..... )馈送到同一模式,它将不起作用。

这是的现场演示

最新更新