【问题标题】:Regex to extract last elements from a list正则表达式从列表中提取最后一个元素
【发布时间】:2021-12-08 22:41:44
【问题描述】:

我可以输入以下列表: V1, V2, V3, V4, V5, V6, V7, V8, V9, V10

我需要一个从上面的列表中提取最后 3 个元素的正则表达式。 因此,应用正则表达式后,列表应如下所示:V8, V9, V10

我已经尝试过这个正则表达式/^.*(?=((,.*){3})$)/,看来我已经接近了,但我不明白为什么用$1 替换时我得到重复的输出。

谁能帮我解释一下?如果我能够理解为什么会发生这种情况,我应该能够纠正它。

【问题讨论】:

  • 请将正则表达式添加到问题正文中。
  • 老实说,是的,正则表达式可以做到这一点,但使用正则表达式非常尴尬,是否有特殊原因必须我用正则表达式完成,或者会做些什么简单点不行吗?
  • 能否请您也发布替换代码?你在使用 JavaScript 吗?

标签: regex


【解决方案1】:

以下正则表达式应该可以工作

/^.*, ([^,]+, [^,]+, [^,]+)$/
  • ^匹配字符串的开头
  • .* 匹配 0 个或更多字符,尽可能多地使用
  • , 匹配逗号后跟空格
  • (开始捕获
  • [^,]+ 匹配一个或多个非逗号
  • 这会重复,因此我们可以匹配最后 3 个元素
  • )结束捕获
  • $匹配字符串结尾

【讨论】:

    【解决方案2】:

    您可以使用

    简单地提取最后三个逗号分隔的值
    [^\s,][^,]*(?=(?:,[^,]*){0,2}$)
    

    请参阅regex demo详情

    • [^\s,] - 除空格和逗号以外的字符
    • [^,]* - 除逗号以外的任何零个或多个字符
    • (?=(?:,[^,]*){0,2}$) - 正向前瞻,需要出现 0 个、1 个或 2 个逗号,然后出现 0 个或多个非逗号字符,直到紧靠当前位置右侧的字符串结尾。

    由于已知问题,您的匹配项被替换了两次,请参阅 Why do some regex engines match .* twice in a single input string?

    【讨论】:

      【解决方案3】:

      对于你的情况,你应该使用?:而不是?=,然后你会得到, V8, V9, V10

      ([a-zA-Z0-9]+(?:,\s[a-zA-Z0-9]+){2})$ 将返回相同的值,不带逗号 V8, V9, V10

      【讨论】:

        【解决方案4】:

        模式中捕获的部分有 3 个逗号,因为前瞻断言以逗号开头的模式 (,.*){3} 重复 3 次

        没有指定语言,但根据支持的正则表达式风格,您还可以对 2 个逗号之间的最后 3 个值使用单个捕获组:

        ^.*(?<!\S)([^,\n]*(?:,[^,\n]*){2})$
        
        • ^ 字符串开始
        • .*整行匹配
        • (?&lt;!\S) 向左声明空白边界
        • (捕获组1
          • [^,\n]* 可以选择匹配除, 或换行符以外的任何字符
          • (?:,[^,\n]*){2} 重复 2 次,匹配 ,, 以外的可选字符或换行符
        • )关闭第一组
        • $ 字符串结束

        Regex demo

        或者作为替代方案,在 , 上拆分,从集合中取出最后 3 个元素,然后使用相同的分隔符将它们重新连接起来。

        使用 JavaScript 的示例:

        const str = "V1, V2, V3, V4, V5, V6, V7, V8, V9, V10";
        console.log(str.split(", ").slice(-3).join(", "));

        【讨论】:

          猜你喜欢
          • 2020-03-17
          • 2012-07-05
          • 2018-08-22
          • 2017-06-28
          • 2021-09-03
          • 2011-12-04
          • 1970-01-01
          • 1970-01-01
          • 2021-09-10
          相关资源
          最近更新 更多