JavaScript正则表达式用$符号替换的WebKit

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.3AppleWebKit/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添加一个尾随空格,然后再将其删除,但我想知道是否有更好的解决方案,并确认我是否应该将其视为错误。


如果从正则表达式中删除“?”会发生什么? - John Fisher
2
首先,在该表达式中,您不需要使用 |。因此,您可以将其编写为 /(end\.)([\s])?$/ 以匹配行末之前的内容。其次,您是要匹配 0 或 1 个 's' 和 '',还是要匹配空格 \s(没有方括号)?http://jsfiddle.net/2hZdT/ - Evan Davis
我刚在Chrome中测试了一下,它可以正常工作。 - Rodrigo Manguinho
@JohnFisher 可能没有一个,例如 Result = "the end.abc".replace( /(end\.)([\s]|$)?/img, makeChange ); 将告诉 makeChange() 不要考虑解释点。 - anweald
@JohnFisher 我觉得我没有表达清楚我的问题。这不是关于匹配什么的问题 - 匹配工作正常 - 而是关于在$2中传递了什么的问题。如果([\s]|$)没有匹配,Webkit会给出相同的结果(“undefined”),就像有匹配并且它降到$的时候一样。前者是你所期望的,我的makeChange代码不会开始解释点。后者在跨浏览器方面是不同的。也许我会尝试制作一个更好的演示。 - anweald
显示剩余8条评论
1个回答

0
如果您想匹配空字符串,您应该在捕获组内包含问号,例如:
/(end\.)((?:\s|$)?)/

原因是一个不捕获任何内容的组与捕获空字符串的组不是同一件事情。例如,考虑以下示例中第二个括号应该捕获什么内容:
/a(b(x))?c/.exec('ac');   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接