子串化两个字符之间的字符串中的所有字母

时间:2017-03-08 08:20:10

标签: r regex

通过在线查看,我无法快速找到解决方案。我只需要抓住下面字符串中$.之间存在的子字符串:

a = "NBA_FINAL_ONCOURT$2016012523.XML"

我使用substrgregexpr的一些复杂组合阅读解决方案,但这并不一定能满足我的需求。

我想做的就是返回"2016012523"

2 个答案:

答案 0 :(得分:5)

您可以使用regmatches / regexpr

的PCRE正则表达式
> a = "NBA_FINAL_ONCOURT$2016012523.XML"
> regmatches(a, regexpr("(?<=\\$)[^.]+", a, perl=TRUE))
[1] "2016012523"

正则表达式非常简单:

  • (?<=\\$) - 在当前分析的位置之前必须有文字$
  • [^.]+ - +以外的一个或多个(.)字符(.内的[...]与文字.匹配)。

注意:要求使用点,您需要附加(?=\\.)前瞻:(?<=\\$)[^.]+(?=\\.)

如果您想使用TRE正则表达式(默认风格),您可以使用相同的模式,将lookbehind (?<=\\$)更改为捕获组(...)(但是,然后,要访问该值,您需要将regmatchesregexec

一起使用
> regmatches(a, regexec("\\$([^.]+)", a))[[1]][2]  ## or "\\$([^.]+)\\." to require a dot
[1] "2016012523"

请注意,此处[^.]+包含捕获括号,这些括号在正则表达式匹配对象中形成一个子组,您可以稍后访问该子组。

或者使用sub作为David commented来匹配整个字符串,捕获捕获组所需的内容,并替换为捕获的子文本的反向引用:

> sub(".*\\$([^.]+)\\..*", "\\1", a)
[1] "2016012523"

下面,

  • .* - 匹配任何0+字符,尽可能多地匹配子模式的最后一次出现
  • \\$ - 文字$(否则,它匹配字符串的结尾)
  • ([^.]+) - 第1组:.
  • 以外的一个或多个字符
  • \\. - 一个文字点
  • .* - 字符串的其余部分。

答案 1 :(得分:-1)

这取决于你的字符串是动态的还是静态的。 如果它是静态的,那么很简单,你可以直接替换那些文本,但如果它是动态的,那么你必须写一些东西。例如。

requestAnimationFrame()