Регулярное выражение для соответствующего текста, за которым следует текст до закрывающей скобки, кроме соответствующей открывающей скобки - PullRequest
1 голос
/ 27 февраля 2020

Извините, если вопрос путаница. Снизу текст

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'

, в основном начиная с выбора max (до), кроме), соответствует открывающей скобке.

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

Это соответствует только до трима (colum2 Нужна помощь для выхода из скобки), если есть открывающая скобка, включая все вложенные

Спасибо

Редактировать: я наконец сделал это 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))
}

1 Ответ

0 голосов
/ 27 февраля 2020

Вам придется заменить разделители строк пробелами в этих выражениях, если вы хотите элегантное решение. Так что вам нужно изменить это -

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 *?\).+) *?\), чтобы соответствовать выражению вы ожидаете.

Вот демоверсия live

Если вы ДЕЙСТВИТЕЛЬНО не хотите заменять терминатор строки в выражении и вместо этого хотите работать с

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]\)[\D\d \n]+)[ \n]*?\). Но я настоятельно рекомендую против этого, потому что, если вы подаете несколько value = ( select..... ) к одному и тому же шаблону, он не будет работать.

Вот живая демонстрация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...