正则表达式 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})
要在 w/00023
这样的上下文中匹配字符串,您可以删除 \B
:
(?<!/)/(?!/)(?=000\d{2})
如果您不关心 0
s,只关心任何数字:
(?<!/)/(?!/)(?=\d)
如果您有 \
(不是 /
),只需将上述正则表达式中的 /
替换为 \
。
我真的不太会用正则表达式,整个早上都在忙着实现以下目标:
我想在保存到数据库之前在 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})
要在 w/00023
这样的上下文中匹配字符串,您可以删除 \B
:
(?<!/)/(?!/)(?=000\d{2})
如果您不关心 0
s,只关心任何数字:
(?<!/)/(?!/)(?=\d)
如果您有 \
(不是 /
),只需将上述正则表达式中的 /
替换为 \
。