【问题标题】:Pattern matching to extract string matching conditions模式匹配提取字符串匹配条件
【发布时间】:2015-10-19 00:42:13
【问题描述】:

我正在尝试提取与字符串中的模式匹配的字符串。说得通:

 x <- "this.is.fairly//Whatit.is/path/IDbeginUntilhere7/seenit"

正则表达式的目标是返回:IDbeginUntilhere。我试过这个:

 str <- regmatches(x, gregexpr("^I.*7$", x))

我知道它不起作用,因为I 位于字符串的中间。这个问题可能太简单了,但如果我能得到任何帮助,我将不胜感激。

【问题讨论】:

  • 省略 ^ 和 $。这些指定模式从字符串的开头开始并在字符串的结尾结束。
  • 谢谢。那么问题就很简单了!
  • 最好是非贪婪的str &lt;- regmatches(x, gregexpr("^I.*?7$", x))str &lt;- regmatches(x, gregexpr("^I[^I]*7$", x))
  • 我会使用 stringr 包,因为它更简洁,更易于阅读:str_extract(x, "I.*?7")
  • 谢谢大家,您能否发布建议以关闭问题。 @ Mariano:我纠正了问题中的一个错字。模式是IDbeginUntilhere,我认为条件以I 开头并以7 结尾就足够了。我们还可以要求字符串位于/ 之间。

标签: regex r


【解决方案1】:

很明显,主要问题是锚点:字符串开头^ 和字符串结尾$

第二个问题是贪心点也会匹配/ 分隔的子部分(即匹配整个Id7/Not-to-match7 而不是Id7)。

你需要使用类似的东西

str <- regmatches(x, gregexpr("I[^/]*7", x))

regex demo

如果您不需要 7,则需要使用前瞻和类似 Perl 的正则表达式:

str <- regmatches(x, gregexpr("I[^/]*(?=7)", x, perl=TRUE))

another demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2011-09-08
    相关资源
    最近更新 更多