Javascript字符串替换 - 这是最好的方法吗?

时间:2010-02-03 21:13:23

标签: javascript regex string escaping

我在使用Javascript中的正则表达式尝试将给定输入字符串转换为给定输出字符串时遇到问题。我甚至不确定我要用正则表达式完成我想要完成的任务,或者使用其他方法最有效率。 我希望有人可以提供帮助:

我有以下输入字符串:

#> Some text goes here, and a 'quoted string' is inside.
<# something with 'quotes' #>
Another 'quoted string' is found <#

我需要在'\'序列之间找到每个引用#>字符和转义版本<#

所需的输出字符串:

#> Some text goes here, and a \'quoted string\' is inside.
<# something with 'quotes' #>
Another \'quoted string\' is found <#

请注意,<# something with 'quotes' #>部分中的引号未被转义,只有#><#之间的引号。

我正在使用以下代码来完成此操作,但我想找到更好或更有效的方法来做同样的事情(注意:回车和制表符保证在我的输入字符串中找不到,所以我可以安全地以下面的方式使用它们:

var s = ... some input string ...;

// Replace all "<#" sequences with tabs "\t"
s = s.split("<#").join("\t"); 

var i = 1;
do
{
    // Replace a single quote that is found within
    // #> and <# block with a carriage return.
    s = s.replace(/((^|#>)[^\t]*?)'/g, "$1\r");

    // Continue replacing single quotes while we're
    // still finding matches.
    s = s.split("\r");
    if (s.length < ++i)
        break;
    s = s.join("\r");
}
while (true);

// Replace each instance of a carriage return
// with an escaped single quote.
s = s.join("\\'");

我不使用单个正则表达式的主要原因是我似乎无法让它替换多个单引号字符。所以我使用了do / while循环来确保所有这些都被转义。

有人有更好的方法吗(请)?

2 个答案:

答案 0 :(得分:4)

此正则表达式匹配不在<# ... #>

内的引号
'(?=((?!#>)[\s\S])*(<#|$))

一个简短的解释:

'             # match a single quote
(?=           # start positive look ahead
  (           #   start capture group 1
    (?!       #     start negative look ahead
      #       #       match the character '#'
      >       #       match the character '>'
    )         #     end negative look ahead
    [\s\S]    #     match any character from the set {'0x00'..'ÿ'}
  )*          #   end capture group 1 and repeat it zero or more times
  (           #   start capture group 2
    <         #     match the character '<'
    #         #     match the character '#'
    |         #     OR
    $         #     match the end of the input
  )           #   end capture group 2
)             # end positive look ahead

或者,用简单的英语:

  

只有在向前看时才能看到单个引号,可以看到子字符串'&lt;#'(或输入的结尾),而不会遇到'#&gt;'在单引号和'&lt;#'之间(或输入的结尾)。

但是这个正则表达式解决方案不会比现在的效率更高(效率更高:运行速度更快)。

为什么您要寻找除当前方法之外的其他内容?你的解决方案对我来说很好。

答案 1 :(得分:0)

以下正则表达式在firebug控制台中可以非常快速地运行数千个字符。

str.replace(/'|\\'/g, "\\'")
   .replace(/(<#[^#\>]*)\\'([^\\']+)\\'([^#\>]*#\>)/g, "$1'$2'$3")

第一个替换所有引号并且已经通过\'转义了引号 第二个查找所有&lt;#... \'... \'...#&gt;并将其替换为&lt;#...'。''。#。#&gt;