【问题标题】:Why does my regex not work inside string.match()?为什么我的正则表达式在 string.match() 中不起作用?
【发布时间】:2014-11-29 15:18:42
【问题描述】:

我认为这个正则表达式应该可以工作:

/(?s)\<strong\>.+\<\/strong\>/

它验证并匹配 regex101.com 上 &lt;strong&gt; 标记之间的所有内容。

但是,当我在正则表达式 match() 方法中使用它时,它不匹配任何内容。

var string = "text text <strong>some text</strong> text text";

var re = /(?s)\<strong\>.+\<\/strong\>/;

alert(string.match(re));

这应该会提醒&lt;strong&gt; 标签以及介于两者之间的所有内容。但是,它根本不起作用。

为什么会这样,我该如何解决?

【问题讨论】:

    标签: javascript regex text-parsing


    【解决方案1】:

    前导 (?s) 是 JavaScript 正则表达式中的无效组。当您尝试这样做时,浏览器控制台肯定会产生错误。

    您不需要转义 &lt;&gt;,所以这样可以:

    var re = /<strong>.+<\/strong>/;
    

    请注意,如果您在一行文本中有多个 &lt;strong&gt; 元素,则您的正则表达式将匹配从第一个 &lt;strong&gt; 到最后一个 &lt;/strong&gt; 的所有内容,因为 + 量词是贪婪。你可以改变它:

    var re = /<strong>.+?<\/strong>/;
    

    【讨论】:

    • 正则表达式中何时允许使用(?s)? RegExp101.com 解释说它是一个内联修饰符。 . .
    • @Godisgood 在某些环境中有效,但 JavaScript 不支持完整的 PCRE 语法。在你使用的那个 regex101 工具中,你可以选择左上角的“JavaScript”,然后它会告诉你它也是一个错误。
    • 啊。非常感谢!
    • @AvinashRaj 有时,也许。
    • 对于这种情况,您必须使用[\S\s]+? 而不是.+?
    【解决方案2】:

    Javascript 不支持 (?s) DOTALL 修饰符。所以在你的正则表达式中使用[\S\s] 而不是.

    <strong>[\s\S]+<\/strong>  // greedy match
    

    对于非贪婪匹配,您需要在+ 符号旁边添加量词?

    <strong>[\s\S]+?<\/strong>
    

    [\s\S]+ 也匹配换行符,但.+ 不匹配换行符。

    > var string = "text text <strong>some text</strong> text text";
    undefined
    > var re = /<strong>[\s\S]+?<\/strong>/;
    undefined
    > console.log()
    
    undefined
    > console.log(string.match(re));
    [ '<strong>some text</strong>',
      index: 10,
      input: 'text text <strong>some text</strong> text text' ]
    

    【讨论】:

      【解决方案3】:

      如果你在浏览器的 js 控制台中尝试(在 firefox 中是 Ctrl + Shift +K)你会得到错误 SyntaxError: 无效的正则表达式组

      它可以在没有 (?s) 部分的情况下工作,你不需要它

      var string = "text text <strong>some text</strong> text text";
      
      var re = /\<strong\>.+\<\/strong\>/;
      
      alert(string.match(re));
      

      【讨论】:

        猜你喜欢
        • 2012-11-17
        • 2012-11-17
        • 2012-08-07
        • 1970-01-01
        • 2015-04-13
        • 2014-06-01
        • 2020-04-02
        • 1970-01-01
        相关资源
        最近更新 更多