grep()正则表达式与新行字符

时间:2015-02-03 19:22:35

标签: regex r

我完全坚持使用R中的正则表达式。我使用www.regex101.com来检查我的正则表达式,它似乎有效。但在R中却没有。 我已经读到不同口味之间存在细微差别,但我不知道这些差异在哪里或者需要注意什么。有没有办法使用lookahead等更高级的regtex工作在像grep(), sub(), gregexpr()这样的R函数中?

这是我的字符串:

x <- "n\n\nwelcome\nstar\n\n\n\n\nhowdy\nstar\n\n\n\n\nhi\nstar\n\n\n\n\ngreetings\nstar"

这是我的正则表达式:

"/(?<=\\n)((?:(?!\\n).)*?)(?=\\nstar)/g"

这是我在R中尝试的:

x <- grep("(?<=\\n)((?:(?!\\n).)*?)(?=\\nstar)",x,perl=TRUE,value=TRUE)

OR

 x <- grep("/(?<=\\n)((?:(?!\\n).)*?)(?=\\nstar)/g",x,perl=TRUE,value=TRUE)

这是我想要的输出:

"welome"        "howdy"         "hi"       "greetings"

谢谢!

2 个答案:

答案 0 :(得分:1)

你似乎不必要地逃避R中的新行(\n),因为你的x只是R中长度为1的向量,grep()将匹配该元素或者它赢了&# 39;吨。它不会在该字符值中提取匹配项。为此,您需要使用gregexpr()函数。这个怎么样

x <-"\n\n\nwelcome\nstar\n\n\n\n\nhowdy\nstar\n\n\n\n\nhi\nstar\n\n\n\n\ngreetings\nstar"
regmatches(x, gregexpr("(?<=\n)((?:(?!\n).)*?)(?=\nstar)",x,perl=TRUE))
# [[1]]
# [1] "welcome"   "howdy"     "hi"        "greetings"

答案 1 :(得分:0)

或者只是简单的strsplit。这会在字符串的开头(可能是拼写错误)或\n基于nstar拆分字符串。

nzchar为空字符串返回逻辑TRUE,否则返回FALSEFilter过滤掉TRUE s

x <- "n\n\nwelcome\nstar\n\n\n\n\nhowdy\nstar\n\n\n\n\nhi\nstar\n\n\n\n\ngreetings\nstar"

Filter(nzchar, strsplit(x, '\n|^n|star')[[1]])

# [1] "welcome"   "howdy"     "hi"        "greetings"