2

我还有另一个 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 字符串是不可变的,我相信这会带来每次反转字符串时分配更多内存的不幸效果。在每次击键时执行此操作(因为它需要在输入框更改时更新摘要行)可能会导致一些问题(...?)。

有没有其他方法可以做到这一点?最好只使用一些正则表达式,并且没有反转......

总而言之,要求是创建一个正则表达式替换,在字符串中搜索这些字符中的任何一个,\ / }并在它们之前添加一个“转义”反斜杠(如果转义反斜杠不存在)。因此,当连续遇到多个反斜杠时,它应该具有智能,以转义每个反斜杠(请注意,我不是在更新实际的输入框,而是我用来更新摘要的变量)。

我需要正则表达式大师的帮助!

4

3 回答 3

2

您可以转义任何不是字母、数字、空格或反斜杠的内容。

string=string.replace(/([^\w \\])/g,'\\$1')
于 2011-03-02T13:21:16.740 回答
1

以下应该解决它:

thisBoxVal = thisBoxVal.replace/((\}|\/(?!\\))|\\)/g,"$1\\");

但这个要求似乎很奇怪。为什么要\\翻译成\\\\,而是\{\{。这也意味着如果字符串foo\\{bar在摘要中,它foo\{bar在输入框中,当您再次保存时,它会foo\{bar在摘要中。这听起来像是一个错误。如果我是你,我会完全放弃消极的前瞻性..

于 2011-03-02T12:48:39.957 回答
1

您可以通过在要转义的字符之前检查偶数个反斜杠来检查现有的反斜杠转义,在这种情况下需要额外的反斜杠:

thisBoxVal = thisBoxVal.replace(/(^|[^\\])((?:\\{2})*)(\\(?=[^\\/}]|$)|[/}])/g, '$1$2\\$3');

正则表达式分解如下:

  • (^|[^\\]):在转义之前,匹配不是转义的东西(字符串开头或非\)
  • ((?:\\{2})*): 偶数个转义字符。在每一对中,第一个逃脱了第二个,所以我们不想碰这些。
  • (\\(?=[^\\/}]|$)|[/}]):要转义的字符:
    • \\(?=[^\\/}]|$): 一个反斜杠,后跟一个不可转义的字符,它是一个不可转义的字符([^\\/}]否则这个反斜杠本身会转义后面的字符)或字符串的结尾。
    • [/}]: 一个可转义的字符,而不是反斜杠。

示例字符串:

thisBoxVal = "sl0: \\;  sl1: /;  sl2: \\\\\\;  nosl0: \\\\;  nosl1: \\{;  sl3: \\";

打印值:"sl0: \; sl1: /; sl2: \\\; nosl0: \\; nosl1: \{; sl3: \"
结果replace"sl0: \\; sl1: \/; sl2: \\\\; nosl0: \\; nosl1: \{; sl3: \\"

于 2011-03-02T13:09:25.617 回答