Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式以精确匹配R中任意数量的字符_R_Regex - Fatal编程技术网

正则表达式以精确匹配R中任意数量的字符

正则表达式以精确匹配R中任意数量的字符,r,regex,R,Regex,我想使用regex计算连续出现的字符数。假设模式为“aa”和“bbb”,即“a”发生的次数正好连续两次“b”精确地连续出现三次(它们可以由任何字符前后限定,除了字符本身之外,不包括任何内容)。如果测试向量为 c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb") 计数结果应如下所示: 与“aa”匹配的模式为c(“baa”、“aab”

我想使用regex计算连续出现的字符数。假设模式为
“aa”
“bbb”
,即
“a”
发生的次数正好连续两次<代码>“b”精确地连续出现三次(它们可以由任何字符前后限定,除了字符本身之外,不包括任何内容)。如果测试向量为

c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")
计数结果应如下所示:

“aa”
匹配的模式为
c(“baa”、“aab”、“aa”、“bbaabbb”)
&

匹配
“bbb”
的模式是
c(“bbba”,“bbaabbb”)

我使用了
“\\”
,但它并没有给出我想要的结果。如果您能提供任何帮助,我将不胜感激。

若要匹配恰好出现两次的字符“a”,您可以使用负向后看与负向前看相结合的方法。也就是说,你在寻找一个

  • 不跟在字符“a”后面
  • 包含字符串“aa”和
  • 后面不跟“a”
其正则表达式是
(?)

示例:

test <- c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")
grep("(?<!a)a{2}(?!a)", test, perl = TRUE, value = TRUE)
# [1] "baa"     "aab"     "aa"      "bbaabbb"
测试
匹配正好出现三次的字符“b”的操作与此类似:

grep("(?<!b)b{3}(?!b)", test, perl = TRUE, value = TRUE)
# [1] "bbba"    "bbaabbb"

grep((?我们也可以拆分并获得

 table(unlist(lapply(strsplit(v1, "(?<=b)(?=a)|(?<=a)(?=b)", perl =TRUE), 
            function(x) x[x %in% c('aa', 'bbb')])))
 # aa bbb 
 # 4   2 

表(未列出(lapply)(strsplit(v1,)(?请共享您用于测试的代码。是否绝对要使用
regex
package?因为您可以使用
stringr
package执行此操作。
vec@Smich,我知道stringr。它将无法忽略任何条件,即它可以在任何字符之前和之后绑定,除了字符本身之外,不包含任何内容。regex I这是我认为可以做到的唯一方法。这不是假设字符串只包含字母“a”和“b”吗?这种方法与
“caa”
不匹配,是吗?对不起,我不是有意抨击你的答案。我认为
strsplit
非常优雅。我只是想知道这种方法是否能抓住
“aa”
字符串中的
“caa”
(…它们可以由任何字符前后绑定,除了字符本身之外,不包括任何内容)是的,Ikop它不仅包含a&b。感谢您Akrun的努力,此外,我不确定这种方法是否可靠。如果我想检查长度1到10,我必须实际键入我想要的所有模式,例如“aa”、“aaa”、“aaaa”,…但通过Ikop的方法,我可以很容易地组合循环和长度函数,以了解a或b的1,2,3,…出现次数。也许如果您可以使其更易于概括而不是具体化。@tundeawo关于您的注释,
table(unlist(lappy)(strsplit(v2)”(?
table(unlist(lapply(strsplit(v2, "(?<=[^a])(?=a)|(?<=a)(?!a)",
         perl = TRUE), function(x) x[x %in% c('aa', 'bbb')])))
# aa bbb 
#  5   2 
v1 <- c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb")
v2 <- c("baa", "aaaa", "aab", "aa", "bbba", "bbaabbb", "caa")