2013-04-04 39 views
2

選擇性的正則表達式我想替換的單詞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正則表達式的用戶有異常處理的搜索方式。

+0

是否有可能輸入將形式爲「等等等等日期等等」? – Dason 2013-04-04 16:10:41

+0

在我的情況下,不,但我希望能夠製作一個更容易被其他人接受的線索,所以讓我們假裝是。 – 2013-04-04 16:13:17

+0

@Stedy我同意你的標題改變的第一部分(並保留它),但後面的部分(與建立的名稱相同)只是巧合,它可能是'雞肉'後跟'@'。我沒有找到專門解決這個問題的R用戶的線索(儘管我確定有這個問題),所以我希望有一個可以輕鬆搜索的標題。 – 2013-04-04 16:19:31

回答

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開出任意字符串但隨後(繼續不匹配,所以(逃避(因爲它是一個特殊字符),我們寫(?!\\))

+0

這兩個回覆都非常有幫助。感謝您花時間詳細解釋這一點。 – 2013-04-04 16:25:50

+1

De nada。這四個環視的說法非常有用,我認爲值得花15-30分鐘來玩四個。這應該足以讓它們成爲你曲目的永久組成部分! – 2013-04-04 16:31:29

+0

這是一個體面的教程,或者你有其他的想法:http://docs.racket-lang.org/guide/Looking_Ahead_and_Behind.html? – 2013-04-05 01:25:47

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) 

?標誌着以下爲可選的,!是各種各樣的否定。

+0

感謝您花時間詳細解釋一下。希望這將成爲其他人可以在類似需求中找到有用的線索。 +1 – 2013-04-04 16:26:36

相關問題