我还有另一个 Javascript 正则表达式难题......(如果这有点啰嗦 - 很难解释!)
我有一个将字符串发送到弹出窗口的脚本(所有字符在发送时都被编码,因此所有反斜杠都被保留)。在弹出窗口中,它有几个文本输入框,还有一个“摘要”范围,它显示所有输入框中的内容,并在检测到按键时更新。然后,当用户完成后,他们单击一个按钮,将更新的摘要字符串发送回开启者。
要求是反斜杠会自动添加到以下字符之前:\ / }
,因此用户不需要自己执行此操作。目前我有代码可以去除输入框中的任何反斜杠,但摘要会在适当的地方添加它们。
例如。如果这个字符串被发送到弹出窗口:foobar\\batz\/hi
那么它在摘要中看起来像这样:foobar\\batz\/hi
并且在输入框中像这样:foobar\batz/hi
。如果您随后在输入框中像这样编辑字符串:foobar\batz/hiya
,那么它在摘要中看起来像这样:foobar\\batz\/hiya
。到目前为止一切都很好......但是如果您尝试在输入框中输入这个:foobar\\batz/hiya
,那么它在摘要中看起来像这样:foobar\\\batz\/hiya
。它应该如下所示:foobar\\\\batz\/hiya
这取决于现有代码(在每个“kepup”上运行)。它基本上需要一个正则表达式来查看字符串,\ / or }
如果它们不存在则添加反斜杠。这需要一个否定的lookbehind来检查预先存在的反斜杠(但是javascript不能做否定的lookbehinds)。我以为我已经通过首先反转字符串(使用自定义函数)并进行负前瞻,然后再次反转字符串来破解这个问题,如下所示:
var thisBoxVal = $(this).val();
thisBoxVal = reverseStr(thisBoxVal);
thisBoxVal = thisBoxVal.replace(/(\}|\/|\\(?!\\))/g,"$1\\");
thisBoxVal = reverseStr(thisBoxVal);
但是,我现在可以看到问题出在哪里。当遇到双反斜杠的第一个(或第二个,因为它被反转)时,它会添加额外的反斜杠。但是因为第二个反斜杠已经有了第一个反斜杠,所以它不会添加它。
每次反转字符串时,我也担心内存分配。这是因为我了解到 javascript 字符串是不可变的,我相信这会带来每次反转字符串时分配更多内存的不幸效果。在每次击键时执行此操作(因为它需要在输入框更改时更新摘要行)可能会导致一些问题(...?)。
有没有其他方法可以做到这一点?最好只使用一些正则表达式,并且没有反转......
总而言之,要求是创建一个正则表达式替换,在字符串中搜索这些字符中的任何一个,\ / }
并在它们之前添加一个“转义”反斜杠(如果转义反斜杠不存在)。因此,当连续遇到多个反斜杠时,它应该具有智能,以转义每个反斜杠(请注意,我不是在更新实际的输入框,而是我用来更新摘要的变量)。
我需要正则表达式大师的帮助!