2

我想替换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()"

我想也许我可以从我之前关于此事的问题中学习:

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

不太好。

如果有人有更好的标题以使此解决方案更通用,请更改它,以便 R 正则表达式用户具有可搜索的处理异常的方法。

4

2 回答 2

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以不匹配开头但随后继续不匹配的字符串,所以(因为它是一个特殊字符而(转义)我们写.((?!\\))

于 2013-04-04T16:13:04.023 回答
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)

其中将?以下标记为可选,而!是一种否定。

于 2013-04-04T16:08:35.420 回答