【问题标题】:Help interpreting a javascript Regex帮助解释 javascript 正则表达式
【发布时间】:2009-07-17 13:44:08
【问题描述】:

我发现以下表达式旨在修改克隆的 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 是什么,如果我使用 Regex Coach 替换功能,如果我只是使用 [0] 作为搜索和 1 作为替换,我会得到正确的结果,但是如果我改变s.replace(/\[0\]/, "["+nel+"]"); 的 javascript 字符串 s 保持不变。

我将不胜感激任何关于原作者意图的建议,并帮助我找到一个解决方案,该解决方案将成功替换搜索字符串中任何位置的方括号中的数字。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    查找

    /           # 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+"]");
    

    【讨论】:

    • 谢谢,非常好的解释。尽管以下警报联系[0],但它对我不起作用:var nel = 1; var s = "联系人[0]"; s.replace(/([^\[]+)\[\d+\]/, "$1["+nel+"]");警报;
    • var s = s.replace(...) 可以解决问题。您需要将替换分配给变量。字符串没有就地修改。
    【解决方案2】:

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

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

    请注意,此正则表达式仅替换方括号内的 0。如果你想替换任何数字,你需要类似的东西:

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

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

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

    s = s.replace(...)
    

    【讨论】:

    • 谢谢,我现在明白了,因此明白这应该有效,但事实并非如此。我已提取此代码并更改为设置 var s = ContactData[0],我已将其放入脚本块内的 vanila html 文件中,但在替换 s 后未更改。任何想法发生了什么?
    • 当您说s = ContactData[0] 时,您的意思是s = "ContactData[0]" 对吗?是内容为ContactData[0] 的字符串,而不是ContactData[0] 数组的索引0 处的值?
    • 附录:...ContactData 数组
    • 抱歉,您是正确的,我在代码中包含了“”。
    【解决方案3】:

    看起来它用 1 替换了 0 的数组。

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

    说明:

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

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

    【讨论】:

      【解决方案4】:

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

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

      因为方括号在正则表达式中具有特殊含义,如果要匹配一个,则需要用斜线对其进行转义。 [ 开始一个字符集,\[ 匹配一个大括号。 (闭合大括号的概念相同。)

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          $1 是对第一个括号对的值的引用。在您的情况下,

          的值
          [^\[]+
          

          匹配一个或多个不是'['的字符

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-09-30
                • 2014-03-24
                • 1970-01-01
                • 2011-06-10
                相关资源
                最近更新 更多