如何使用带有可选模式的正则表达式提取文本?

时间:2016-08-13 11:18:54

标签: regex r string match

我想在" one:" "二:" 之间以及"二:" 和"三:" 在字符串 s1 &#34 ;一:bla 1二:bla2三:bla3" 。但是"二:bla2" 不一定出现在字符串 s2 中。所以如果它是 s2 "一个:bla 1三:bla3" 它也应该有效。

我已经提出了以下R代码,但我尝试使用"两个附加括号:..." 和问号不起作用:

library(gsubfn)
s1 <- "one: bla 1 two: bla2 three: bla3"
s2 <- "one: bla 1 three: bla3"
strapplyc(s1, "one: (.*) (two: (.*))? three: (.*)")
strapplyc(s2, "one: (.*) (two: (.*))? three: (.*)")

1 个答案:

答案 0 :(得分:2)

问题可能是.*之后的one:也在使用two:部分及其之后的文字。例如,您的行中的匹配组将是

1: "bla 1 two: bla2"
2: [empty]
3: "bla3"

您可以通过使用问号使第一个星号非贪婪来解决此问题。

其他一些观点:我认为你应该将空格放在two:部分的括号内,否则当它不可用时,one:和{{1}之间必须有两个空格部分。

此外,对于较小的整理,您可以使用two:使可选部分周围的括号无法捕捉。您只想捕获三件事,?:部分周围的括号仅用于优先级,因此无需捕获。

总而言之,你会有这样的事情:

two: