【问题标题】:JavaScript RegExp objectsJavaScript 正则表达式对象
【发布时间】:2009-02-05 17:22:03
【问题描述】:

我尝试用 JavaScript 编写一个简单的 Markdown 解析器。因此我想检查[link content][link id] 语法。我使用以下代码:

data = data.replace( /\[(.*?)\][ ]*\[([0-9]+)\]/g, '<a href="$2">$1</a>' );

效果很好,但现在我想用 RegExp 对象来做这件事。所以我设置了以下代码:

var r = new RegExp( '\[(.*?)\][ ]*\[([0-9]+)\]', 'g' );
data = data.replace( r, '<a href="$2">$1</a>' );

但它不起作用。它甚至说我的正则表达式(因为第一个例子做得很好)是无效的:

正则表达式中的不匹配)

我认为这一定与我不知道的一些 RegExp 对象特性有关。 我做错了什么,如何解决问题?

【问题讨论】:

  • 附带说明,您可能会发现通过在线测试器 (pagecolumn.com/tool/regtest.htm) 运行 JavaScript 正则表达式很有用。
  • 谢谢,这似乎是一个很棒的工具。我使用了这个 (regexp-evaluator.de/evaluator) PHP-ish 评估器。在 JS 中编写脚本时,也许 JS-ish 更好:)
  • data.replace(/foo/g, 'bar')data.replace(new RegExp('/foo', 'g'), 'bar') 是同一个东西

标签: javascript regex


【解决方案1】:

因为 RegExp 构造函数的第一个参数是字符串,而不是模式文字,所以您必须转义反斜杠,因为您希望在模式中使用文字反斜杠:

var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' );

【讨论】:

  • 嗯.. 没有考虑那些字符串问题。现在很明显了。谢谢:-)
【解决方案2】:

除了模式的反斜杠问题,这个:

data = data.replace( r, '<a href="$2">$1</a>' );

可能很危险。我假设你已经处理了 HTML 转义,所以我不能这样做:

[<script>stealCookies()</script>][http://oops.example.com/]
[hover me][http://hello" onmouseover="stealCookies()]

但您仍然需要检查 URL 是否是已知良好的方案,所以我不能这样做:

[click me][javascript:stealCookies()]

您可能希望使用该方法的 String.replace(r, func) 变体,并在您的替换制作 'func' 中包含验证。

【讨论】:

    【解决方案3】:
    var r = /\[(.*?)\][ ]*\[([0-9]+)\]/g;
    data = data.replace( r, '<a href="$2">$1</a>' );
    

    【讨论】:

      【解决方案4】:

      双转义反斜杠:

      var r = new RegExp( '\\[(.*?)\\][ ]*\[([0-9]+)\\]', 'g' );
      

      【讨论】:

        【解决方案5】:

        你需要双重转义:

        var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' )
        

        【讨论】:

          猜你喜欢
          • 2016-04-24
          • 1970-01-01
          • 2012-10-26
          • 2012-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多