【问题标题】:Regular expression to match first few characters repeated twice in string正则表达式匹配字符串中重复两次的前几个字符
【发布时间】:2020-02-13 10:42:04
【问题描述】:

我遇到了一个问题,即在 R 语言的字符串中查找所有 前几个 (>=2) 个字符 重复 两次 的字符串。
例如

字符串应该选择出来
(1) allochirally ------>前3个字符'all'在字符串中重复两次
(2) froufrou ------> 前 4 个字符 'frou' 在字符串中重复两次
(3) undergrounder ------>前5个字符'under'在字符串中重复两次

字符串应该选择出来
(1) gummage ------> 甚至第一个字符 'g' 重复了两次,但只有 1 个字符,不匹配条件为 >=2 个第一个字符
(2) hypergoddess ------>前几个字符没有重复两次
(3) kgashga ------>甚至'ga'重复了两次,但不包括第一个字符'k',不匹配需要包括第一个字符的条件

听说过 backreference(例如 \b 或 \w)可能会有所帮助,但仍然无法弄清楚,您能帮忙弄清楚吗?

注意:我看到有一个函数xmatch <- str_extract_all(x, regex) == x作为使用方法,str_extract_all来自library(stringr)

x <- c("allochirally", "froufrou", "undergrounder", "gummage", "hypergoddess", "kgashga")
regex <- "as described details here"
function(x, regex) {
  xmatch <- str_extract_all(x, regex) == x
  matched_x <- x[xmatch]
}

如果很简洁就好了!!谢谢

【问题讨论】:

  • 这些似乎是作业的一部分。了解更多

标签: r regex string regular-language


【解决方案1】:

使用grepl:

x <- c("allochirally", "froufrou", "undergrounder", "gummage", "hypergoddess", "kgashga")
grepl("^(.{2,}).*\\1.*$", x)

[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE

正则表达式模式匹配并捕获前两个或更多字符,然后还断言相同的两个或更多字符出现在字符串的后面。

如果您想使用我的答案中的逻辑来获得匹配字符串的向量,那么只需使用:

x[grepl("^(.{2,}).*\\1.*$", x)]

[1] "allochirally"  "froufrou"      "undergrounder"

【讨论】:

  • 嗨,蒂姆,感谢您的快速回复,只需添加一个重要信息,看起来它仅限于使用 str_extract_all 而不是 grepl,因为 grepl 您的解决方案有效,只需尝试使用带有“str_extract_all”的模式,看起来不适用于str_extract_all(string, regex)
  • @Lampard 你能把你的电话给str_extract_all吗?
  • @Lampard - 您可能不想使用str_extract_all(),因为该模式匹配(或不匹配)字符串的整个长度。请改用str_extract()。如果您想要返回一个逻辑值而不是字符串,请使用str_detect()
  • @Tim,用str_extract_all 的调用方式更新详细信息,你的答案的x 向量与我以前测试的完全一样,regex 参数就是这里讨论的内容
  • @Lampard 只是猜测,但请尝试:str_extract_all(x, "(.{2,}).*\\1.*") ... 使用开始和结束锚点,因为 API 已经将模式应用于整个字符串。
【解决方案2】:

怎么样:

^(\w{2,}).*?\1.*?$

如所见here

说明:

第一个捕获组(\w{2,})匹配前几个字符,后向引用\1指的是这个捕获组。

如果以后需要,可以参考使用 group(1) 重复的部分字符

【讨论】:

  • 嗨,Robo,谢谢你的详细解释,你的解决方案也有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多