【问题标题】:Return the first occurrence of a character in a string返回字符串中第一次出现的字符
【发布时间】:2015-09-28 12:37:58
【问题描述】:

我一直试图在出现第一个 ^ 符号后提取一部分字符串。例如,字符串看起来像abc^28092015^def^1234。我需要提取28092015 夹在第一个两个^ 标志之间。

所以,我需要从第一个 ^ 符号的出现中提取 8 个字符。我一直在尝试提取第一个 ^ 符号的位置,然后将其用作 substr 函数中的参数。

我试过用这个:

x=abc^28092015^def^1234 `rev(gregexpr("\\^", x)[[1]])[1]`

参考here讨论的答案。

但它继续返回最后一个位置。谁能帮帮我?

【问题讨论】:

  • 你不需要正则表达式(即使它也可以用正则表达式完成)。只需split^ 的字符串并获取第二个元素。

标签: regex r string


【解决方案1】:

我会使用子。

x <- "^28092015^def^1234"
sub("^.*?\\^(.*?)\\^.*", "\\1", x)
# [1] "28092015"

由于^ 是正则表达式中的一个特殊字符,您需要转义该字符以匹配文字^ 符号。

或

对^进行拆分,得到第二个索引的值。

strsplit(x,"^", fixed=-T)[[1]][2]
# [1] "28092015"

或

您也可以使用gsub。

gsub("^.*?\\^|\\^.*", "", x, perl=T)
# [1] "28092015"

【讨论】:

    【解决方案2】:

    这是一个带有基本 R 的选项:

    x <- "abc^28092015^def^1234"
    m <- regexpr("(?<=\\^)(.+?)(?=\\^)", x, perl = TRUE)
    ##
    R> regmatches(x, m)
    #[1] "28092015"
    

    【讨论】:

      【解决方案3】:
      x <- 'abc^28092015^def^1234'
      library(qdapRegex)
      unlist(rm_between(x, '^', '^', extract=TRUE))[1]
      # [1] "28092015"
      

      【讨论】:

        【解决方案4】:

        另一个选项是stri_extract_first 来自library(stringi)

        library(stringi)
        stri_extract_first_regex(str1, '(?<=\\^)\\d+(?=\\^)')
        #[1] "28092015"
        

        如果是两个^之间的任意字符

        stri_extract(str1, regex='(?<=\\^)[^^]+')
        #[1] "28092015"
        

        数据

        str1 <- 'abc^28092015^def^1234'
        

        【讨论】:

          【解决方案5】:

          如果你使用^分割它会更好。但是如果你仍然想要这个模式,你可以试试这个。

          ^\S+\^(\d+)(?=\^)
          

          然后匹配组 1。

          输出

          28092015
          

          见DEMO

          【讨论】:

            猜你喜欢
            • 2015-05-04
            • 2022-12-04
            • 2018-02-05
            • 1970-01-01
            • 1970-01-01
            • 2017-05-28
            • 1970-01-01
            • 2013-10-04
            • 2018-10-16
            相关资源
            最近更新 更多