2015-06-16 2 views
3

Не уверен, что если это действительно возможно, но рассмотрим следующий текст:Динамическое регулярное выражение, чтобы захватить

INSERT INTO cms_download_history 
SET 
user_id  = '{$userId}', 
download_id  = '{$fileId}', 
remote_addr  = '{$remote_addr}', 
doa = GetDate()"; 

Я хочу, чтобы изменить это, чтобы быть:

INSERT INTO cms_download_history 
(user_id,download_id,remote_addr,doa) 
VALUES('{$userId}','{$fileId}','{$remote_addr}',GetDate()); 

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

INSERT INTO mystery_table 
SET 
col1 = val1 
col2 = val2 
.... unknown number of columns and values. 

Есть ли динамическое регулярное выражение, которое я могу написать, чтобы обнаружить этот пример?

+0

Если я правильно понял ваш вопрос, вы могли бы просто разбить строку на (запятую и) разрыв строки в качестве первого шага. – Xufox

+0

@Xufox Я не следую ... –

+0

Вы можете разделить текст на отдельные строки и подсчитать, проанализировать и изменить их отдельно, а не применять RegEx ко всему тексту. По крайней мере, это было бы легче. – Xufox

ответ

1

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

(\w+)\W*=\W*['"].+?(?!\\)['"], 

Here is an example. Вот что он делает:

  • Она захватывает один или несколько символов слова, если за ними следует:
    • Ноль или более пробельных символов
    • Равное знак
    • Ноль или более пробельных символов (снова)
    • ' или " (начало строки)
    • Один или более символов
    • неэкранированный ' или "
    • запятая

Обратите внимание, что это предполагается, что все значения являются строками. Если вам также нужна поддержка номеров, пожалуйста, дайте мне знать.

+1

Это идеальное спасибо. и отрегулировать его как 'INSERT ([^ S] | S [^ E] | SE [^ T]) * SET \ n? ((\ w +) \ W * = \ W * ['"]. +? (?! \\) ['"], \ n) *' поможет мне поймать только эти строки, у которых есть «insert..set» перед ними –

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