2013-05-27 43 views
2

我想弄清楚一個正則表達式會從字符串中去掉一組自定義標記。舉例來說,如果我有串,正則表達式來刪除自定義標記

s = "{\n \"graph\": \"#! graph1 !#\",\n\"element\": \"#! 
    document.getElementById('x_axis1') !#\",\n\"orientation\": \"bottom\" \n}" 

我所要的輸出是

"{\n \"graph\": graph1 ,\n\"element\": document.getElementById('x_axis1') 
,\n\"orientation\": \"bottom\" \n}" 

我嘗試下面的代碼

gsub('\"#!([^!].*)!#\"', "\\1", s) 

但它僅刪除第一組標記。我真的很感激,如果任何人都可以指向我的正則表達式,將剝奪所有的自定義標記。

+0

perl = TRUE似乎有幫助,但你的例子是無效的R語法(太多引號) – baptiste

+0

這是將R對象轉換爲JSON的結果。我本質上是試圖傳遞一些參數作爲對象而不是字符串,這就是爲什麼標記。 – Ramnath

+0

我想說的是,如果我複製並粘貼到控制檯中,它返回一個錯誤,因爲它不是一個有效的字符串('x_axis1'是問題)。如果我用double替換這些單引號,那麼你的正則表達式中的perl = TRUE似乎工作正常。 – baptiste

回答

6

試試這個:

gsub("#!(.*?)!#", "\\1", s) 

只要你不接受嵌套的 「塊」 的#!...!#(例如,#! hello #! world !# goodbye !#爲一體的發生),你不需要檢測「不匹配」的塊,這應該做你需要的一切。

如果確實需要嵌套匹配,則需要構建適當的分析器而不是使用正則表達式。 (這並不難;只是值得注意的是,你不能使用正則表達式來檢測任意嵌套的塊)。

+2

沒有嵌套塊。你的'gsub'將刪除包括標記之間的文本在內的所有內容,我想保留這些文本。 – Ramnath

+0

對。修正了@Ramath。對於那個很抱歉。 – sigpwned

+0

現在這個工作。 – Ramnath

0

您就可以使用兩個gsub S:

gsub('!#"', "", gsub('"#!', "", s)) 
+0

這很好,但我只想刪除出現在模式'!#...#!'後面的事件。 – Ramnath

4

這是你的正則表達式。 [^!].*中的.*匹配從graph.1 !#....開始的所有內容(包括換行符)。

嘗試(改變[^!].*[^!]*):

gsub('\"#!([^!]*)!#\"', "\\1", s) 
#> cat(gsub('\"#!([^!]*)!#\"', "\\1", s)) 
#{ 
# "graph": graph.1 , 
# "element": document.getElementById('x_axis1') , 
# "orientation": "bottom" 
#}> 
+0

不錯。這似乎也起作用。我只是測試幾個用例。我想知道爲什麼'perl = TRUE'也有效。有什麼想法嗎? – Ramnath

+0

我認爲這是因爲Perl在'.'中不包含'\ n',而擴展正則表達式(在沒有指定perl = T的情況下默認是) –

+0

注意 - 如果你有'!',這將失敗。嵌入到字符串中,如'「​​foo」:「#!bar!!#」'。如果不能保證'!'將不會在字符串中,我建議@ sigpwned的答案(非貪婪的匹配)。 –