Javascript 如果不';不存在

Javascript 如果不';不存在,javascript,regex,replace,backslash,Javascript,Regex,Replace,Backslash,我还有一个Javascript正则表达式难题。。。(如果这有点冗长,请道歉-很难解释!) 我有一个脚本,它向弹出窗口发送一个字符串(所有字符在发送时都被编码,所以所有反斜杠都被保留)。在弹出窗口中,它有几个文本输入框,还有一个“摘要”范围,显示所有输入框中的内容,并在检测到键控时更新。然后,当用户完成时,他们单击一个按钮,该按钮将更新的摘要字符串发送回开场白 要求将反斜杠自动添加到以下字符的前面:\/},因此用户无需自己执行此操作。目前,我有一段代码可以去掉输入框中的任何反斜杠,但是总结会在适当

我还有一个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”上运行)。它基本上需要一个正则表达式来查看字符串,如果反斜杠不存在,则向
\/或}
添加反斜杠。这需要一个负lookbehind来检查预先存在的反斜杠(但是javascript不能执行负lookbehind)。我认为我已经破解了这个问题,首先反转字符串(使用自定义函数),然后进行负前瞻,然后再次反转字符串,如下所示:

var thisBoxVal = $(this).val();
thisBoxVal = reverseStr(thisBoxVal);
thisBoxVal = thisBoxVal.replace(/(\}|\/|\\(?!\\))/g,"$1\\");
thisBoxVal = reverseStr(thisBoxVal);
不过,我现在知道问题出在哪里了。当遇到双反斜杠的第一个(或第二个,因为它是反向的)时,它会添加额外的反斜杠。但是因为第二个反斜杠已经有了第一个反斜杠,所以它不会添加它

我还担心每次字符串反转时的内存分配。这是因为我了解到javascript字符串是不可变的,我相信这会带来一个不幸的后果,即每次字符串反转时都会分配更多内存。在每次击键时执行此操作(因为每次更改输入框时都需要执行此操作以更新摘要行)可能会导致一些问题(…?)

还有别的方法吗?最好是用一些正则表达式,不要反转

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


我需要regex大师的帮助

以下几点可以解决这个问题:

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

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

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

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

  • (^ |[^\\])
    :在转义之前,匹配不是转义的内容(字符串或非转义的开头)
  • ((?:\\{2})*)
    :偶数个转义字符。在每对转义字符中,第一个转义第二个,因此我们不想碰它们
  • (\\(?=[^\\/}]\$)\[/}])
    :要转义的字符:
    • \\(?=[^\\/}]\$)
      :反斜杠,后跟不可转义的内容,即不可转义的字符(
      [^\\/}]
      ,否则此反斜杠本身将转义后面的字符)或字符串结尾
    • [/}]
      :除反斜杠以外的可转义字符
示例字符串:

thisBoxVal = "sl0: \\;  sl1: /;  sl2: \\\\\\;  nosl0: \\\\;  nosl1: \\{;  sl3: \\";
打印值:
“sl0:\;sl1:/;sl2:\\;nosl0:\;nosl1:\{;sl3:\”


replace
“sl0:\\;sl1:\/;sl2:\\\;nosl0:\\;nosl1:\{;sl3:\\”
您可以转义不是字母、数字、空格或反斜杠的任何内容

string=string.replace(/([^\w \\])/g,'\\$1')

你的括号不平衡。谢谢!我认为它工作不正常,但我没有意识到仍然需要反转字符串。我认为我发现了一个问题。如果我键入
\/
,我希望在摘要
\\\/
中看到这一点。有什么想法吗?顺便问一下你对
foo的评论\\{bar
在摘要中-一开始就被视为无效(我的代码在最初解析字符串时去掉了无效的反斜杠)请尝试
replace/(\}(?!\\)\\\\\\\\\\\/)/g,“$1\\”);
但这将给出
\/
。你是在添加一个要求,在斜杠后面添加一个额外的反斜杠吗?不完全是。我只是在寻找一些正则表达式,它将在“\”、“/”或“}”中添加一个反斜杠。因此
\/}
将成为
\\/\}
\\
将成为
\\\\\\
\/\/
将成为
\\/\\\/
,等等:)非常好;只有两个警告:你应该使用
((?:\{2})*)
而不是
(\\{2})*
,否则如果他们的n