2015-12-01 45 views
2

中第一個括號之外的文本我知道它被問了很多次,但我試圖根據需要調整其他答案,但我無法使用SKIP和FAIL使其工作(我有點困惑,我不得不承認)刪除R

我實際上使用R。

我需要清理的網址是:

url <- "posts.fields(id,from.fields(id,name),message,comments.summary(true).limit(0),likes.summary(true).limit(0))" 

,我需要只保留總是由「田」字爲前綴的第一個括號裏面的內容(而「上崗」可能會有所不同)。換句話說就像

id,from.fields(id,name),message,comments.summary(true).limit(0),likes.summary(true).limit(0) 

正如你可能看到裏面有一些嵌套。但我最終可以改變我的源代碼,以接受此字符串太(以每前綴去除每parhentesis)

id,from,message,comments,likes 

我不知道如何刪除尾隨parhentesis其平衡之首。

回答

2

如果它不夠好,只是刪除了一切和包括首開括號並刪除最後一個右括號,然後再:

sub("^.*?\\((.*)\\)[^)]*$", "\\1", url) 

注:

如果它不夠好只刪除第一個左括號和最後一個右括號然後試試這個:

sub("\\((.*)\\)", "\\1", url) 
1

使用懶惰.*而不是貪婪:

sub(".*?fields\\((.*)\\)", "\\1", url) 
[1] "id,from.fields(id,name),message,comments.summary(true).limit(0),likes.summary(true).limit(0)" 
1

你需要使用遞歸模式:

sub("[^.]*+(?:\\.(?!fields\\()[^.]*)*+\\.fields\\(([^()]*+(?:\\((?1)\\)[^()]*)*+)\\)(?s:.*)", "\\1", url, perl=T) 

demo

細節:

# reach the dot before "fields(" 
[^.]*+    # all except a dot (possessive) 
(?:    # open a non-capturing group 
    \\.   # a literal dot 
    (?!fields\\() # not followed by "fields(" 
    [^.]*   # all except a dot 
)*+    # repeat the group zero or more times 

\\.fields\\(

# match a content between parenthesis with any level of nesting 
(    # open the capture group 1 
    [^()]*+ # 0 or more character that are not brackets (possessive) 
    (?:  # open a non capturing group 
     \\( 
     (?1) # recursion in group 1 
     \\) # 
     [^()]* # all that is not a bracket 
    )*+  # close the non capturing group and repeat 0 or more time (possessive) 
)    # close the capture group 1 
\\) 

(?s:.*)  # end of the string 

Possessive quantifiers這裏使用限制當出於任何原因回溯到pa的一部分時ttern失敗。

+0

「需要」似乎是一個相當強大的說法,因爲在你之前發佈的簡單得多的答案... – Frank

+0

這真的很好,除了我需要做的只是模式開始(帖子|評論)。字段,而這似乎總是做... –

+0

@GabrieleB:在這種情況下,你需要的是在\\。fields'前添加倒序:'(?<= \\ bposts | \\ bcomments)' –