我想在字符串中替换单词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用户有可搜索的处理异常的方法。
答案 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)
?
将以下内容标记为可选,而!
则排除其他类别。