正则表达式的零宽断言的一个小应用
先给出一个需求:
数据表中有一列存储了一些脏字,比如:
a*b
c*d
e\*f
...
现在想把该字段所有的"*"号替换成"\*",但是如果*号前面已经有了\,则不必替换
如果你可以用正则表达式很快解决这个问题,可以不必看下面的文字
-------------------
当然解决这个问题有很多方法,现在我们尝试用正则表达式去解决,查阅了很多资料,尤其是这篇文章:《正则表达式30分钟入门教程》版本:v2.3 (2008-4-13) 作者:deerchao 转载请注明来源
终于解决了这个问题,该文中提到了“零宽断言”的概念 :
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
“(?<!exp)"的意思是匹配前面不是exp的位置
因此匹配前面不是反斜杠的正则表达式应该这样写:
(?<!\\)\*
解决了这一步,替换也不难了,文章开头的问题也迎刃而解! 有兴趣的朋友可以继续学习