3

使用 $ 匹配输入结束在其他任何地方都会给出零长度匹配,但没有与 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 添加一个尾随空格,然后将其删除,但我想知道是否有人有更好的解决方案并且可以确认我应该将此作为错误提出。

4

1 回答 1

0

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

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

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

/a(b(x))?c/.exec('ac');   
于 2012-06-09T11:55:22.130 回答