Javascript正则表达式Lookbehind失败

时间:2009-09-07 16:12:05

标签: javascript regex

我希望这会有一个非常快速和简单的答案。我正在使用regular-expressions.info来帮助我获得正确的正则表达式,将URL编码的ISO-8859-1磅符号(“%A3”)转换为URL编码的UTF-8磅符号(“%C2” %A3" )。

换句话说,当只有%A3没有前缀为%C2时,我只想将%A3与%C2%A3交换。

所以我认为以下内容可行:

Regular Expression: (?!(\%C2))\%A3
Replace With:       %C2%A3

但它没有,我无法弄清楚为什么!

我认为我的语法略有错误,但我无法理解!有什么想法吗?

仅供参考 - 我知道以下内容将起作用(并在此期间将其用作解决方法),但我们真的想了解前者无效的原因。

Regular Expression: ([^\%C2])\%A3
Replace With:       $1%C2%A3

TIA!

4 个答案:

答案 0 :(得分:4)

不幸的是,(?!)语法是否定前瞻性。据我所知,JavaScript不支持负面的lookbehind。

你可以做的是继续进行替换,最后得到%C2%C2%A3弦,但这些可以很容易地在第二次传递中转换为所需的%C2%A3。

答案 1 :(得分:4)

为什么不将((%C2)?%A3)替换为%C2%A3,使前缀成为匹配的可选部分?这意味着即使文本已经正确,你也会用自己“替换”文本,但我没有预见到性能问题。

答案 2 :(得分:3)

你可以替换

(^.?.?|(?!%C2)...)%A3

$1%C2%A3

答案 3 :(得分:1)

我建议您使用the functional form of Javascript String.replace(请参阅“将函数指定为参数”一节)。这允许您将任意逻辑(包括必要时的状态)放入正则表达式匹配会话中。对于你的情况,我使用一个更简单的正则表达式匹配你想要的超集,然后在函数调用中你可以测试它是否符合你的确切标准,如果没有,那么只是按原样返回匹配的字符串。

这种方法的唯一问题是,如果你有重叠的潜在匹配,你有可能错过第二个匹配,因为没有办法返回一个值来告诉replace()方法它不是真的毕竟是匹配。