正则表达式 Lookahead/behind 查找字符,除非后跟相同

Regex Lookahead/behind to find character unless followed by the same

我真的不太会用正则表达式,整个早上都在忙着实现以下目标:

我想在保存到数据库之前在 SQL 字符串中找到 unicode 字符,即“\00026”,并通过将“\”替换为“\”来转义“\”,除非它已经有两个“\” " 个字符。

\(?=[0])(?<![\])

是我写的,据我了解是这样的:

find the "\" character, positive look ahead for a "0", and look behind to check it isn't preceded by a "\"

但是不行,显然我理解错了!

我可以缩短为\(?=[0])

但是我在 0 之前得到了“\”,即使它前面还有另一个“\”

那我该怎么做:

Replace("[=11=]026", "regex", "\") to get "\00026"
AND ensure that 
Replace("\00026", "regex", "\") also gives "\00026"

非常感谢大家的帮助!

编辑:

这必须解析整个字符串并替换所有出现的地方,而不仅仅是第一个——为了清楚起见。如果它有很大的不同,我也会使用 VB.net。

您可以使用以下正则表达式:

(?<!/)/(?=0)

并替换为//

DEMO

让我解释一下为什么您的正则表达式不起作用。

  • \ - 匹配 \
  • (?=[0]) - 检查(不匹配)下一个字符是否为 0
  • (?<![\]) - 检查(但不匹配)前面的字符(即 \)是否不是 \.

最后一个条件总是匹配失败,因为 \\。所以,没什么意义吧?

如果你想匹配 / in /000xx 整个 字符串(例如用空格分隔),其中 x 是任何数字,你可以使用

\B(?<!/)/(?!/)(?=000\d{2})

demo (go to Context tab)

要在 w/00023 这样的上下文中匹配字符串,您可以删除 \B:

(?<!/)/(?!/)(?=000\d{2})

如果您不关心 0s,只关心任何数字:

(?<!/)/(?!/)(?=\d)

如果您有 \(不是 /),只需将上述正则表达式中的 / 替换为 \