2013-08-13 2 views
1

У меня есть файлы кода SQL, которые я хочу украсить, и у меня возникают проблемы с различием между тем, является ли определенная строка/часть кода строкой или комментарием.Дифференцируя строки SQL из комментариев

Мой текущий процесс я делаю шаблон поиска/Сличитель через файл и вытащить строки с регулярным выражением N?'([']{2}|[^'])*+'(?!') и комментарии с \s*--.*?\n|/\*.*?\*/, и поместить их в соответствующие массивы хранения данных, чтобы избежать их форматирования.

Примеры:

WHERE y = 'STRING' ->WHERE y = THIS_IS_A_STRING и strings[0] = 'STRING'

SELECT x --do not format ->SELECT x THIS_IS_A_COMMENT и comments[0] = --do not format

После украшая все, я потом пройти и искать THIS_IS_A_STRING и THIS_IS_A_COMMENT и восстановить их соответствующие значения из массивы.

Проблема, с которой я столкнулся, заключается в том, что в комментарии есть апостроф, или если в строке SQL есть двойные тире. Я могу исправить одну проблему, но она вызывает другую, в зависимости от того, хочу ли я сначала сохранить строки или комментарии.

Например:

--Don't format this с сохранением строк, идущих первым будет соответствовать 'nt format this всему пути до следующего ', (из-за способности иметь многострочные строки).

С другой стороны, если я выбираю, чтобы сохранить комментарии первыми:

SELECT x FROM y WHERE z = '--THIS_IS_AS_STRING--', он обнаружит -- и не хранить все до следующего символа новой строки в массив комментариев.

Любая помощь будет очень признательна.

EDIT: Я знаю, что, вероятно, следует сделать это с помощью SQL синтаксического анализа, но я работаю над этим с главным регулярное выражение, и это последний шаг мне нужно заканчивая

+1

Это задание для синтаксического анализатора SQL, а не регулярного выражения. – GriffeyDog

ответ

0

Я сделал это reqexp:

/^(([^\\'"\-]+|\-[^\\'"\-]|\\.)+|-?'([^\\']+|\\.)+'|-?"([^\\"]+|\\.)+")+\-\-[^\n]+/ 

Чтобы соответствовать thouse правила для SQL комментарии

  • комментарий строка заканчивается --, комментарий, и разрыв строки.
  • перед комментарием мы можем иметь:
    • любые символы, кроме \'"-
    • -, если не последует какой-либо из \'"-
    • в \ следует любой символ, включая \'"-
    • пару ' что dosn Между ними нет ', если у него есть нечетное число из \ inforont.
    • пара ", которая не имеет между ними ", если у нее нет нечетного числа \ inforont.
    • пары могут иметь один - inforont из них, но не 2

сделал я скучаю Somthing?

0

Эта ссылка может помочь: Java Regex find/replace pattern in SQL comments

Я вставить код здесь

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 
} 

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

0

Хотя я понимаю, что Song ищет решение для решения этой проблемы, я хотел бы указать, что SQL не является регулярным (https://stackoverflow.com/a/5639859/2503659), поэтому не существует никакого регулярного выражения.

С учетом сказанного, я думаю, что другие дали хорошие решения для обычных сценариев.

Смежные вопросы