【问题标题】:Regex to match not start of line正则表达式不匹配行首
【发布时间】:2011-06-23 08:44:51
【问题描述】:

我有以下 XML 标记

<list message="2 < 3">

我想将文本中的&amp;lt;替换为&amp;lt;

如果&amp;lt; 没有出现在行首,则需要一个正则表达式来匹配它。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您很可能可以使用lookbehind来做到这一点:

    /(?<!^)</
    

    见:http://www.regular-expressions.info/lookaround.html

    【讨论】:

      【解决方案2】:

      [^&lt;]+ = 一个或多个不是的字符

      &lt; =

      替换:

      ([^<]+)<
      

      与:

      $1&lt;
      

      【讨论】:

      • 这对我不起作用。这看起来只有在字符串不以 &lt; 开头时才匹配(它可以),然后匹配所有内容,直到遇到第一个 &lt;。你有一个可运行的例子吗? JavaScript?
      • 那不匹配字符,匹配整个子串从开始到字符。我想知道如何将其标记为已接受
      • @Davos 建议您在regex101.com 之类的地方尝试一下,您可以看到它确实有效。我假设在消息中间的开头&lt;&lt; 之间至少有一个字符。我没有在正则表达式的开头声明^,所以它不排除以&lt;开头的行
      • 我的立场是正确的,这确实适用于可能以 &lt; 开头的行,并且确实回答了这个问题。上面的其他 cmets 不正确。我已经删除了我上面的评论。
      【解决方案3】:

      点“。”表示“任何值”

      .<
      

      无论如何,我想你也不想要空格。如果是的话,那么

      \S\s*<
      

      【讨论】:

        【解决方案4】:

        这会在第一个实例之后给你“

        [^<]<
        

        【讨论】:

          【解决方案5】:

          试试这个:

          (?<="[^"]*)<(?=[^"]*")
          

          【讨论】:

            【解决方案6】:

            @duncan 的方法在你只想替换的情况下可以正常工作,但它与&lt; 不匹配。 如果您使用 javascript,所有后向操作都将不起作用。因为javascript不支持lookbehind,除非您在nodejs中打开--harmony标志或在chrome中打开实验性javascript功能。 但是前瞻将在这里工作,即: /(?!^)</ 将匹配不在行首的&lt;。 替换将是: '<list message="2 < 3">'.replace(/(?!^)</, '&lt;')

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-11-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多