正则表达式Lookahead /后面找到字符,除非后面跟着相同

时间:2015-06-12 12:19:24

标签: regex vb.net replace replaceall

我对Regex并不擅长并且整个上午一直在努力实现以下目标:

我希望在保存到数据库之前在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("\00026", "regex", "\\") to get "\\00026"
AND ensure that 
Replace("\\00026", "regex", "\\") also gives "\\00026"

所有人都非常感谢!

编辑:

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

2 个答案:

答案 0 :(得分:1)

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

  • \\ - 匹配\
  • (?=[0]) - 检查(不匹配)下一个字符是0
  • (?<![\\]) - 如果前面的字符(\)不是\,则检查(但不匹配)。

最后一个条件将始终无法匹配,因为\\。所以,没有多大意义,对吧?

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

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

请参阅demo (go to Context tab)

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

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

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

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

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

答案 1 :(得分:0)

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

$ awk 'gsub(/\|/,",") && gsub(/^,|,$/,"") && $3~/^,600/' file
201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953
202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953

$ awk -F, 'gsub(/\|/,",") && gsub(/^,|,$/,"") && $3~/^600/' file
201480         ,6001400030046472   ,6001400030046771   ,2012         ,6100202520       ,AAA2777953
202853         ,6001700000180323   ,6001700000180722   ,2012         ,6100202520       ,AAA2777953

并替换为(?<!/)/(?=0)

请参阅DEMO