搜索并替换字符串中的字符串,但前提是它不在引号内

时间:2011-12-05 12:33:52

标签: php sql regex string

字符串如下所示:

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

所以我想用其他东西替换abc,但不要影响引号内的abc。与def相同,它使用双引号...

这实际上是对于包含SQL查询的字符串,我想替换表名而不用可能包含相同单词的字段中的错误数据替换。

5 个答案:

答案 0 :(得分:2)

负面的后视和前瞻应该足够了:

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

确保abc前面没有单引号(?<!')以及否定前瞻以确保abc后面没有单引号(?!'),这是负面的背后隐藏。

显然,对于单引号用双引号来说,这是微不足道的:

(?<!")def(?!")

答案 1 :(得分:2)

你可以使用具有负前瞻和负后看的正则表达式。您可以在此处详细了解:http://www.regular-expressions.info/lookaround.html

以下是与abc匹配的示例:

(?<!['"])(?<target>abc)(?!['"]) - 这将匹配任何未被单引号或双引号包围的 abc

答案 2 :(得分:1)

表格名称出现在特定关键字后面:

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

我会根据这个事实建立替代模式。

答案 3 :(得分:1)

你可以像这样使用regexp

//   $ new_string = preg_replace(“/ \”(。)\“| \'(。)\'/”,“test”,$ string);

答案 4 :(得分:1)

您使用的是哪个版本的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)