【问题标题】:Match all characters after the last instance of a string in regex匹配正则表达式中最后一个字符串实例之后的所有字符
【发布时间】:2019-11-18 11:43:46
【问题描述】:

我希望捕获正则表达式中最后一个字符串实例之后的所有字符。

字符串(我们在最后一个实例之后搜索的)如下,不带引号:" - ",或\b\s\-\s\b:边界(空白字符,前面是-,前面是空白字符) .

测试字符串如下:

One Thing - Two Things - Three Things - Four Things

想要的匹配:

Four Things

这个正则表达式只匹配字符串的第一个实例之后的所有内容:

(?<=\b\s\-\s\b)(.*)$

(返回,无引号:"Two Things - Three Things - Four Things"

而这匹配最后一个单个字符之后的所有内容-:

[^\-]+$

(返回,无引号:" Four Things"

想法?

【问题讨论】:

    标签: regex


    【解决方案1】:

    这匹配字符串的结尾,在- 之后的所有不是- 的内容。

    -\s*([^-]+)$
    

    这是我能想到的最简单的正则表达式。

    【讨论】:

      【解决方案2】:

      我认为你可以在不使用环视的情况下获得匹配。

      您可以匹配除字符串开头的换行符之外的任何字符,然后匹配您的模式。这将匹配最后一个实例。

      然后在一个匹配 0+ 次的组中捕获除换行符之外的任何字符,直到字符串末尾。

      ^.*\b\s\-\s\b(.*)$
      
      • ^ 字符串开始
      • .* 匹配除换行符以外的任何字符
      • \b\s\-\s\b\ 匹配你的模式
      • (.*) 在第 1 组中捕获匹配除换行符以外的任何字符的 0+ 倍
      • $字符串结束

      Regex demo

      没有列出工具或编程语言,但如果支持\K 忘记匹配的内容,您也可以使用:

      ^.*\b\s\-\s\b\K.*$
      

      Regex demo

      【讨论】:

        【解决方案3】:

        尝试使用积极的lookbehind然后否定-分隔符并获取最后一个结果

        (?<=- )[^-]+$

        https://regex101.com/r/sMX9FC/1

        【讨论】:

          【解决方案4】:

          .*(?<=\b\s\-\s\b)(.*)$,或者在您当前的正则表达式 should achieve what you're after, 之前放置一个 .*,因为默认情况下这是一个贪婪匹配。

          【讨论】:

          • 我不太了解 \b 并且似乎在 php 中运行不顺利...没有它对我有用 .*(?<=\s\-\s)(.*)$(在 javascript 中都可以)
          • @AntonyGibbs 这是单词边界上的零长度匹配。并非所有地方都支持,但由于它是由 OP 作为示例给出的,因此我认为它在他使用的环境中得到支持。
          猜你喜欢
          • 1970-01-01
          • 2023-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-25
          相关资源
          最近更新 更多