关于单词/字符的选择性正则表达式

时间:2013-04-04 16:06:41

标签: regex r

我想在字符串中替换单词Date的所有情况,除非它是Date()(即Date后跟括号)。这是一个字符串的示例以及我最初尝试过的内容:

x <- c("frDate", "Date()", "Date", "Sys.Date()")
gsub("Date", paste("Date:", Sys.Date()), x)

我得到了什么:

> gsub("Date", paste("Date:", Sys.Date()), x)
[1] "frDate: 2013-04-04"     "Date: 2013-04-04()"     "Date: 2013-04-04"      
[4] "Sys.Date: 2013-04-04()"

我想要的是什么:

> gsub("Date", paste("Date:", Sys.Date()), x)
[1] "frDate: 2013-04-04"     "Date()"     "Date: 2013-04-04"      
[4] "Sys.Date()"

我想也许我可以从previous question了解此事:

gsub("(?=[^Date\\(\\)[^Date]])", paste("Date:", Sys.Date()), x)

不太好。

如果某人有更好的头衔使这个解决方案更加通用,请更改它,以便R regex用户有可搜索的处理异常的方法。

2 个答案:

答案 0 :(得分:6)

只需在您的模式中添加与前括号匹配的负前瞻断言。 (您还必须设置perl=TRUE才能获得此功能。)

gsub("Date(?!\\()", paste("Date:", Sys.Date()), x, perl=TRUE)
[1] "frDate: 2013-04-04" "Date()"             "Date: 2013-04-04"  
[4] "Sys.Date()"   

该名称听起来令人生畏,我怀疑#@!$%^&* - 像符号串一样吓跑了人们,但实际上并不复杂:只需输入(?!...),用任何模式替换...您希望整个正则表达式匹配。在这里,我们希望任何字符串以Date开头但随后继续(不匹配,因此(转义(因为它是一个特殊字符)我们写{{1} }。

答案 1 :(得分:3)

gsub('Date$', paste('Date:', Sys.Date()), x)为你工作?

# [1] "frDate: 2013-04-04" "Date()" "Date: 2013-04-04"   "Sys.Date()"   

正则表达式中的$运算符表示行尾。这样,只有x中以Date结尾的值才会匹配。如果您遇到blah blah Date blah的情况,那么您也希望匹配正则表达式会变得更加复杂。

您还可以匹配Date,然后匹配(以外的任何内容:

gsub('Date(?!\\()', paste('Date:', Sys.Date()), x, perl=TRUE)

?将以下内容标记为可选,而!则排除其他类别。