使用grep识别n以上的所有数字

时间:2017-11-30 23:43:16

标签: r regex grep

我有一个包含X.1 - X.13的字符向量(实际上,还有许多其他东西,包括其他编号的变量和以X为特征的变量)。我想找到X.3 - X.13,并且该效果使用grep和以下表达式:

x <- paste0("X.", 1:13)
grep("^X\\.[3-9]{1}|^X\\.[0-9]{2}", x)

我的问题:这里有更好,更短的表达吗?我知道这可能相当简单,但我只是想更好地理解正则表达式。

1 个答案:

答案 0 :(得分:0)

您的模式包含两个选项,^X\\.[3-9]{1}匹配X.3X.9^X\\.[0-9]{2}匹配X.00X.99。那不是你想要的。

要仅X.3找到X.13,请使用

grep("^X\\.(?:[3-9]|1[0-3])\\b", x)

或者,要在任何右侧上下文中匹配(右侧没有单词边界):

grep("^X\\.(?:1[0-3]|[3-9])", x)

请参阅the regex demo

或者,如果号码后面有字母或_,请将\\b替换为(?!\\d),并确保将perl=TRUE传递给grep默认TRE正则表达式引擎不支持作为前瞻构造的函数:

grep("^X\\.(?:[3-9]|1[0-3])(?!\\d)", x, perl=TRUE)

请参阅this regex demo

另一点:^插入符号用于表示字符串的开头。如果您要匹配字符串中任何位置的子字符串,请将其删除或替换为\\b以匹配X前面没有_,字母或数字的^(请参阅{{3} })。

<强>详情

  • X\\. - 字符串开头
  • X. - (?:子字符串
  • 1[0-3] - 小组的开头:
    • 1 - 0后面跟着3|的数字
    • [3-9] - 或
    • ) - 3到9
  • \\b - 非捕获组的结束
  • $.get() - 字边界