【问题标题】:Javascript regex replace using $ with WebKitJavascript 正则表达式使用 $ 替换 WebKit
【发布时间】:2012-05-08 10:55:30
【问题描述】:

使用 $ 匹配输入结束在其他任何地方都会给出零长度匹配,但没有与 WebKit 匹配的证据:

function showBug() {
  Result = "the end.".replace( /(end\.)([\s]|$)?/img, makeChange );
  return;
  }
function makeChange() {
  for ( var i = 0; i < arguments.length; i += 1 ) {
    document.write( "arg" + i + " -->" + arguments[ i ] + "<--"  + "<BR>" );
    }
  }               

给予

arg0 -->end.<--
arg1 -->end.<--
arg2 -->undefined<--
arg3 -->4<--
arg4 -->the end.<--

对于AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3, 也适用于AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19

Opera (Presto/2.10.229 Version/11.62)、FF (Gecko/20100101 Firefox/10.0.2) 和 IE (MSIE 8.0; Trident/4.0) 都给了

arg0 -->end.<--
arg1 -->end.<--
arg2 --><--
arg3 -->4<--
arg4 -->the end.<--

这意味着我可以检测到 $2 中的匹配项(实际上是将 url 上的尾随点解释为不是 url 的一部分)。我目前正在为 WebKit 添加一个尾随空格,然后将其删除,但我想知道是否有人有更好的解决方案并且可以确认我应该将此作为错误提出。

【问题讨论】:

  • 如果删除“?”会发生什么?来自正则表达式?
  • 首先,您不需要该表达式中的|。所以你可以写 /(end\.)([\s])?$/ 在行尾之前匹配一些东西。其次,您是要匹配 's' 和 '\' 的 0 或 1,还是要匹配空格 \s(无括号)? jsfiddle.net/2hZdT
  • 我刚刚在 Chrome 中测试过,它可以工作。
  • var t = "结束。".replace( /(end\.)([\s]|$)+/img, "###"); “t”的值是“###”
  • @JohnFisher 好主意,这使得 WebKit 显示匹配发生。但是现在正则表达式没有做我想要的,即在 else eoi 之后找到一个至少有一个空格的点。

标签: javascript regex webkit replace


【解决方案1】:

如果要匹配空字符串,则应在捕获组中包含问号,例如

/(end\.)((?:\s|$)?)/

原因是不捕获任何内容的组与捕获空字符串的组不同。例如,想一想以下示例中第二个括号应包含的内容:

/a(b(x))?c/.exec('ac');   

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 2014-01-26
    • 2010-11-12
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多