【问题标题】:A Regex positive lookahead正则表达式正前瞻
【发布时间】:2015-01-05 04:26:19
【问题描述】:

我想用 RegExp 从另一个字符串中获取一个子字符串。

来源:\\abc\\\$
模式:/\\+(?=\$)$/
预期结果:\\\

所以我希望在字符串的末尾得到结果,但是积极的前瞻并不能如我所愿。没有 (?=) 部分它可以工作,但给了我 $ 符号 => \\\$ 但我不需要它。

这里有什么问题?
谢谢。

【问题讨论】:

    标签: regex


    【解决方案1】:

    问题是向前看是一个零宽度的断言。表达式的 (?=\$) 部分不会“使用”字符。因此,表达式会在您向前看后查找字符串的结尾,但会找到 $ 字符。

    改用/\\+(?=\$$)/

    【讨论】:

      【解决方案2】:

      您需要将行尾$ 放在前瞻内,因为前瞻不消耗字符。他们只是检查前一个令牌是否跟在前瞻中的令牌之后。

      /\\+(?=\$$)/
      

      DEMO

      【讨论】:

        【解决方案3】:

        您可能也打算使用捕获组;你确定第二个 $?

        试试这个(如果字符串必须以$ 结尾):

        /(\\+)(?=\$$)/
        

        或者这个(如果 $ 可以出现在字符串中的任何位置):

        /(\\+)(?=\$)/
        

        【讨论】:

          【解决方案4】:

          你的正则表达式:

          \\+(?=\$)$

          执行以下操作:

          • 匹配 1 次和无限次之间的反斜杠字符...\\+
          • 匹配字符$的正向前瞻...(?=\$)
          • 断言位置在行尾。 $

          修正后的正则表达式为:

          \\+(?=\$$)

          这个正则表达式可以:

          • 匹配 1 次和无限次之间的反斜杠字符...\\+
          • 正向先行匹配字符 $ 并断言它在行尾 ...(?=\$$)

          主要问题是,正向预读不消耗字符。
          它是一个零长度的断言,就像行尾一样。
          所以你必须在正向预读中断言,即$ 字符位于行尾。

          【讨论】:

            猜你喜欢
            • 2015-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-14
            • 2010-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多