比方说,我想要一个只匹配18到31之间数字的正则表达式。执行此操作的正确方法是什么?
我有一组像这样的字符串:
"quiz.18.player.total_score"
"quiz.19.player.total_score"
"quiz.20.player.total_score"
"quiz.21.player.total_score"
我正在尝试仅匹配包含数字18-31的字符串,并且目前正在尝试类似
(quiz.)[1-3]{1}[1-9]{1}.player.total_score
这显然不起作用,因为它实际上将匹配11-39之间的所有数字。正确的方法是什么?
答案 0 :(得分:3)
正则表达式:1[89]|2\d|3[01]
要进行匹配,请添加其他文本并转义点:
quiz\.(?:1[89]|2\d|3[01])\.player\.total_score
详细信息:
(?:)
非捕获组[]
匹配列表中存在的单个字符|
或\d
匹配一个数字(等于[0-9]
)\.
点.
匹配任意字符 答案 1 :(得分:2)
!)如果s
是字符向量,则将这些字段读入数据框中以摘除第二个字段并检查其是否在所需范围内。将结果放入逻辑向量ok
中,并从s
中获得那些元素。这不使用正则表达式,仅使用基数R。
digits <- read.table(text = s, sep = ".")$V2
s[digits %in% 18:31]
2)另一种基于模式"\\D"
匹配任何非数字的方法是删除所有此类字符,然后检查剩余的字符是否在所需范围内:
digits <- gsub("\\D", "", s)
s[digits %in% 18:31]
2a)在R的开发版本(版本为3.6.0)中,我们可以像这样使用whitespace
的新trimws
参数:
digits <- trimws(s, whitespace = "\\D")
s[digits %in% 18:31]
3)另一种方法是简单地构造边界字符串并将s
与它们进行比较。仅当s
中的所有数字部分完全相同的数字(问题中显示的示例就是这种情况)时,此方法才有效。
ok <- s >= "quiz.18.player.total_score" & s <= "quiz.31.player.total_score"
s[ok]
答案 2 :(得分:1)