我有一个包含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)
我的问题:这里有更好,更短的表达吗?我知道这可能相当简单,但我只是想更好地理解正则表达式。
答案 0 :(得分:0)
您的模式包含两个选项,^X\\.[3-9]{1}
匹配X.3
到X.9
,^X\\.[0-9]{2}
匹配X.00
到X.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()
- 字边界