帮助解释javascript正则表达式

时间:2009-07-17 13:44:08

标签: javascript regex

我找到了以下表达式,用于修改克隆的html元素的id,例如将contactDetails[0]更改为contactDetails[1]

var nel = 1;
var s = $(this).attr(attribute);
    s.replace(/([^\[]+)\[0\]/, "$1["+nel+"]");
    $(this).attr(attribute, s);

我对正则表达式并不十分熟悉,但在The Regex Coach的帮助下试图解释它,但我仍然在努力。 ([^\[]+)似乎匹配一个或多个不是“[”且\[0\]/匹配[0]的字符。中间的/我将其解释为“包括两者”,所以我不明白为什么作者甚至包含了第一个表达式。

我不明白替换字符串中的$ 1是什么,如果我使用正则表达式Coach替换功能,如果我只使用[0]作为搜索而1作为替换我得到正确的结果,但是如果我将javascript更改为s.replace(/\[0\]/, "["+nel+"]");字符串s保持不变。

对于原始作者的意图以及寻找能够成功替换搜索字符串中任何位置的方括号中的数字的解决方案的任何建议,我将不胜感激。

8 个答案:

答案 0 :(得分:2)

$1是对正则表达式中第一个组的反向引用。组是()内的部分。因此,在这种情况下,$1将替换为([^\[]+)部分匹配的任何内容。

如果字符串为contactDetails[0],则生成的字符串为contactDetails[1]

请注意,此正则表达式仅替换方括号内的0。如果您想要替换任何数字,您将需要以下内容:

([^\[]+)\[\d+\]

\d匹配任何数字字符。 \d+然后变成至少一个数字的任何序列。

但是你的代码仍然无效,因为Javascript字符串是不可变的。这意味着一旦创建它们就无法更改。 replace方法返回一个新字符串,而不是更改原始字符串。你应该使用:

s = s.replace(...)

答案 1 :(得分:2)

<强>查找

/           # Signifies the start of a regex expression like " for a string
([^\[]+)    # Capture the character that isn't [ 1 or more times into $1
\[0\]       # Find [0]
/           # Signifies the end of a regex expression

<强>替换

"$1["       # Insert the item captured above And [
+nel+       # New index
"]"         # Close with ]

要创建捕获任何数字的表达式,您可以将0替换为\d+,其匹配数字1次或更多次。

s.replace(/([^\[]+)\[\d+\]/, "$1["+nel+"]");

答案 2 :(得分:1)

看起来像用0替换0的数组。

例如:array [0]转到数组[1]

说明:

([^ [] +) - 这部分意味着保存所有不是[变量$ 1的变量 [0] / - 此部分限制第1部分将所有内容保存到[0]

“$ 1 [”+ nel +“]” - 打印$ 1的内容(从第1部分加载)并添加值为nel的括号。 (在你的例子中,nel = 1)

答案 3 :(得分:0)

方括号定义了一组要匹配的字符。 [abc]将匹配字母a,b或c。

通过添加克拉,您现在指定您希望字符不在集合中。 [^abc]将匹配任何不是a,b或c的字符。

因为方括号在RegExps中具有特殊含义,所以如果要匹配,则需要使用斜杠转义它们。 [启动一个字符集,\[匹配一个大括号。 (关闭括号的概念相同。)

因此,[^\[]+会捕获一个或多个不是[的字符。

在括号中包含“捕获”字符串的匹配部分(在本例中为“contactDetails”,以便您可以在替换中使用它。

$1在替换字符串中使用“捕获”字符串(即“contactDetails”)。

答案 4 :(得分:0)

此正则表达式匹配“某事物”后跟[0] “某事物”由表达式[^\[]+标识,该表达式匹配不是[的所有字符。您可以在此表达式周围看到(),因为匹配将在以后重复使用$ 1。你的正则表达式的其余部分 - 即\[0\]只匹配索引[0]。作者必须写\[\],因为[和]是正则表达式的特殊字符,必须进行转义。

答案 5 :(得分:0)

$ 1是对第一个paranthesis对的值的引用。在你的情况下,

的值
[^\[]+

匹配一个或多个不是'['

的字符

正则表达式的剩余部分匹配字符串'[0]'。

因此,如果s是'foobar [0]',结果将是'foobar [1]'。

答案 6 :(得分:0)

[^\[]将匹配任何不是[的字符,“+”表示一次或多次。所以[^ [] +将匹配contactDetails。括号将捕获此以供以后使用。 '\'是转义符号,因此结尾\[0\]将匹配[0]。替换字符串将使用$ 1,这是括号中捕获的并添加新索引。

答案 7 :(得分:0)

您对正则表达式的解释是正确的。它旨在匹配一个或多个非[的字符,后跟文字[0]。在replace方法中使用时,匹配将替换为第一个分组的匹配(即$1替换为的内容)以及序列[后跟值{ {1}}和nel(这就是]的解释方式)。

同样,一个简单的"$1["+nel+"]"也是如此。除非s.replace(/\[0\]/, "["+nel+"]")前面没有任何内容,因为在这种情况下,第一个正则表达式找不到匹配项。