--- title: 零宽断言 date: '2017-04-17' slug: zero-width-assertion --- ```{r include=FALSE} knitr::opts_chunk$set(collapse = TRUE) ``` 关于正则表达式中的零宽断言(zero-width assertions),我从来都记不住哪个是向前,哪个是向后,就像寄信永远记不住收信人和寄信人谁的地址写上面谁的写下面一样[^1]。遂写两个例子在此,以便将来查阅。 零宽断言在 R 里面是 Perl 正则表达式的一部分,语法是小括号里带问号 `(?啥啥啥)`,它的唯一作用是用来在特定位置找一段字符串,只管找不找得到(断言),在涉及到提取、替换的操作时候它不会被提取或替换掉,就仿佛它是没有宽度的幽灵一样。这个功能非常有用,有时候你想提取(或替换)一个字符串,但同时又想附加一个或两个条件,比如这个字符串的前面或后面必须带有什么特征,但这个特征本身不是你想提取的东西。 想要匹配一个特征的话在问号后面用等号,想要不匹配一个特征用感叹号(通常是逻辑非的操作符),这个好记。我经常忘记的是 `(?=)` 和 `(?<=)`、或者 `(?!)` 和 `(?