字符串如下所示:
abc def
123 'abc' abc "def"
bla bla
所以我想用其他东西替换abc
,但不要影响引号内的abc。与def
相同,它使用双引号...
这实际上是对于包含SQL查询的字符串,我想替换表名而不用可能包含相同单词的字段中的错误数据替换。
答案 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)