JavaScript RegExp对象

时间:2009-02-05 17:22:04

标签: javascript regex

我尝试用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-object特性有关。 我做错了什么以及如何解决问题?

5 个答案:

答案 0 :(得分:13)

因为RegExp构造函数的第一个参数是字符串而不是模式文字,所以你必须转义反斜杠,因为你需要模式中的文字反斜杠:

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

答案 1 :(得分:1)

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

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'中包含验证。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

双重逃避你的反斜杠:

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

答案 4 :(得分:0)

你需要双重逃避:

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