Java Regex найти / заменить шаблон в комментариях SQL - PullRequest
1 голос
/ 13 октября 2011

Я хочу найти / заменить символ / шаблон ТОЛЬКО в комментариях SQL (однострочные комментарии - и комментарии блока / * * /).Исходной строкой является сценарий SQL.

В данный момент я ищу точку с запятой (;) в комментариях и хочу заменить ее пробелом.

Источник

CREATE OR REPLACE PROCEDURE TESTDBA.PROC_REUSING_BINDED_VAR_N_DSQL

 AS
        a NUMBER:=2;
        b NUMBER:=3; -- jladjfljaf; lakjflajf
-- alksdjflkjaf ladkjf 
        v_plsql_tx VARCHAR2(2000);
    begin
        v_plsql_tx := 'BEGIN ' || ' :1 := :1 + :2; ' || 'END;';
        execute immediate v_plsql_tx
        using in out a, b;
        insert into testdba.NEW_TESTING_TABLE(CHARACTER_VALUE) VALUES('a='||a);
   end PROC_REUSING_BINDED_VAR_N_DSQL;
-- lajdflajf

/*lakjdfljalfdk; alkdjf*/

/*asdf 
;
asdfa*/

/*
    adf
asd asdf


*/

Подскажите, пожалуйста, что-нибудь.

Спасибо

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Я бы сделал это так:

    try {
    Pattern regex = Pattern.compile("(?:/\\*[^;]*?\\*/)|(?:--[^;]*?$)", Pattern.DOTALL | Pattern.MULTILINE);
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        // matched text: regexMatcher.group()
        // match start: regexMatcher.start()
        // match end: regexMatcher.end()
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

Вышеприведенное даст вам все комментарии без ';'. Затем я перебирал строку за строкой в ​​файле sql, и когда я встречал строку, содержащую комментарий, я проверял, есть ли эта строка в моем списке совпадений - если нет, то я выполняю поиск замены; с '' во всем комментарии. Конечно, вам нужно будет найти, где заканчивается комментарий, но это легко - заканчивается в той же строке и / * и когда найден первый * /. Таким образом, вы можете изменить любое количество; с тем же кодом.

1 голос
/ 13 октября 2011

Что вам нужно выяснить первым: есть два способа обработки многострочных комментариев.

  1. Один "* /" закрывает все открытые в настоящее время "/*".
  2. Для каждого "/ *" вам нужно соответствующее "* /" (вложенные комментарии).

Первый вариант относительно прост в реализации. Второе может быть выполнено либо с помощью глубокого магического регулярного выражения (читай: не поддерживается будущими программистами), либо с помощью короткой программы.

Первый довольно прост: использование "/\*.*;.*\*/" даст вам совпадение, когда есть встроенная точка с запятой.

Второму потребуется немного программирования. Если вы встретите «;», вам нужно проверить, что вы в данный момент находитесь внутри комментария. Вы можете узнать это, просто последовательно прочитав файл (игнорируя возврат каретки / перевод строки) и увеличивая число всякий раз, когда вы встречаете «/ *», и уменьшая число при встрече с «* /». Если число не меньше 1, ваша точка с запятой находится внутри комментария.

1 голос
/ 13 октября 2011

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

Одна строка: \\-\\-[^;]*(;) - не уверен, что лучший способ найти несколько ; внутри строки

Многострочный: /\\*[^;(\\*/)]*?(;)[^;]*?\\*/ - все равно что-то вроде этого

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