【问题标题】:grep and regular expressions - meta/wildcard charactersgrep 和正则表达式 - 元/通配符
【发布时间】:2012-12-13 01:23:59
【问题描述】:

这是一个更大更复杂数据集的最小示例,只是想弄清楚一些事情。

> grep("X10\\.1+",c("X10.10","X10.11","X10.12"))
[1] 1 2 3

现在我预计只返回2,因为“+”应该是“前一个元素的 1 个或多个”。我认为逃避期间(我必须处理,所以想在示例中保留它)可能会导致问题。

> grep("X101+",c("X1010","X1011","X1012"))
[1] 1 2 3

那么,我对“+”功能的理解是错误的?

结论:

谢谢@詹姆斯。所以我的理解是 + 是“前一个元素的另一个或多个”,而不是它的实际含义,即“前一个元素的一个或多个”。

11+ 会完成我的想法(在第一个 1 之后有一个额外的 1 或多个 1 等)。干杯

【问题讨论】:

  • 嗨,您能解释一下为什么您预计只有 2 个被退回吗?
  • 嗨 Nikos。根据我对 + 的理解,我预计只有 2 个,它是前面元素的 1 个或多个。所以 1+ 对于 11 或 111 或 1111 应该为 TRUE,但对于 10 或 12 等则不是,因为 0 是与 1 不同的字符。

标签: regex r


【解决方案1】:

您需要表示在任意数量的 1 之后,您想要匹配字符串的结尾。您使用$ 来执行此操作。

grep("X10\\.1+$",c("X10.10","X10.11","X10.12"))
[1] 2

同样,^ 匹配字符串的开头,如果您想限制匹配以 X10. 开头,而不是 PX10.,例如将由现有正则表达式匹配。

【讨论】:

  • 谢谢詹姆斯。我玩弄了美元。我不明白的是 + 是前面权利的 1 个或更多?不是零或更多。因此,X10.10 应该是错误的,因为在第一个之后至少没有另一个 1。如果将 X10.110 视为真的,我可以理解您的意思,但在我看来,选择 X10.10 仍然是错误的。
  • 我并不是说我认为你错了 :) 我想如果使用 * 你可能会选择 1 2 和 3,但肯定 + 要求它有 .11不管使用 $?
  • 否,+ 表示符号的一个或多个实例,包括原来的那个,即1+ 是一个单一实体,表示一个或多个1
  • +rep,他为什么需要用$匹配字符串的结尾
  • @Nikos 因为否则它匹配包含模式的字符串,这是 OP 发布的问题。
【解决方案2】:

在这种情况下,前面的元素是数字“1”,它出现在所有 3 个元素中的那个位置。您之前对“+”的理解是正确的。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2011-08-05
    • 2011-01-08
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多