我有一个包含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)我的问题是:有没有更好、更短的表达式可以用在这里?我知道这可能是相当琐碎的,但我只是想更好地理解正则表达式。
发布于 2017-12-01 15:46:34
您的模式包含两个备选方案,^X\\.[3-9]{1}将X.3与X.9匹配,^X\\.[0-9]{2}将X.00与X.99匹配。这不是你要找的。
要仅定位X.13的X.3,请使用
grep("^X\\.(?:[3-9]|1[0-3])\\b", x)或者,在任何右侧上下文中进行匹配(右侧没有单词边界):
grep("^X\\.(?:1[0-3]|[3-9])", x)或者,如果数字后面可以有字母或_,请将\\b替换为(?!\\d),并确保将perl=TRUE传递给grep函数,因为默认的TRE正则表达式引擎不支持lookahead构造:
grep("^X\\.(?:[3-9]|1[0-3])(?!\\d)", x, perl=TRUE)另一点:^插入符号用于表示字符串的开始。如果您想要匹配字符串中的任何位置的子字符串,请将其删除或替换为\\b,以匹配前面没有_、字母或数字的X (请参见another regex demo)。
详细信息
^ -字符串的开始X\\. -a substring(?: -组的开始:1[0-3] - 1后跟从0到9的数字- X. -1-3到9
) - end of the non-capturing group\\b -a word group\\b(非捕获边界的结束-一个单词边界)
https://stackoverflow.com/questions/47584472
复制相似问题