Поиск и замена строки в строке, но только если она не в кавычках - PullRequest
1 голос
/ 05 декабря 2011

Строка выглядит так:

abc def
  123 'abc' abc "def"
  bla bla

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

Это на самом деле для строки, содержащей запросы SQL, я хочу заменить имена таблиц, не заменяя по ошибке данные из полей, которые могут содержать одно и то же слово.

Ответы [ 5 ]

2 голосов
/ 05 декабря 2011

Вы можете использовать регулярные выражения с негативным прогнозом и негативным прогнозом. Подробнее об этом вы можете прочитать здесь: http://www.regular -expressions.info / lookaround.html

Вот пример, который соответствует abc:

(?<!['"])(?<target>abc)(?!['"]) - это будет соответствовать любому abc , не заключенному в одинарные или двойные кавычки.

2 голосов
/ 05 декабря 2011

Отрицательного взгляда сзади и предвкушения должно хватить:

(?<!')abc(?!')

Существует отрицательный взгляд на то, что abc не предшествует ни одна кавычка (?<!'), а также отрицательный взгляд на то, чтобы abc не сопровождался ни одной кавычкой (?!').

Очевидно, это тривиально можно изменить, чтобы отключить одинарные для двойных кавычек:

(?<!")def(?!")
1 голос
/ 05 декабря 2011

Какую версию sql вы используете? Некоторые версии sql (большинство?) Не поддерживают регулярные выражения.


Основной подход, который мне известен (например, в MS SQL Server), заключается в написании функции, которая фактически анализирует всю строку, проверяет интересующие вас условия и заменяет при необходимости.

Поскольку это будет функция с несколькими операторами, у нее есть свои накладные расходы. Поскольку это звучит как разовое, обычно это не так уж плохо.


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

Найдите все вхождения, которые вы НЕ хотите заменять, и замените их шаблоном удержания. (Должно быть известно, что этот шаблон еще не существует в данных.) Выполните замену, а затем верните шаблон удержания в исходную строку.

Start = abc "abc" 'abc'
Step1 = abc "xxx" 'abc'    -- REPLACE('"abc", '"xxx"', start)
Step2 = abc "xxx" 'xxx'    -- REPLACE('''abc''', '''xxx''', step1)
Step3 = ??? "xxx" 'xxx'    -- REPLACE('abc', '???', step2)
Final = ??? "abc" 'abc'    -- REPLACE('xxx', 'abc', step3)
1 голос
/ 05 декабря 2011

Вы можете использовать regexp как этот:

// $ new_string = preg_replace ("/\"(.) \" | \ '(. ) \'/», "тест", $ строка);

1 голос
/ 05 декабря 2011

Имена таблиц появляются после определенных ключевых слов:

FROM tablename
JOIN tablename
INNER JOIN tablename
LEFT JOIN tablename
...

Я бы построил шаблон замены на основе этого факта.

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