【问题标题】:regular expression on replace method of js not workingjs替换方法的正则表达式不起作用
【发布时间】:2012-04-10 11:25:15
【问题描述】:

为什么这不起作用

var value = arr[row][col].replace(new RegExp('"', 'g'),'""');

错误:网页错误详情

用户代理:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Media Center PC 6.0 ;InfoPath.2;平板电脑 2.0) 时间戳:2012 年 4 月 10 日星期二 11:22:01 UTC

消息:对象不支持此属性或方法 线路:1041 字符:25 代码:0 网址:http://example.com/?

消息:对象不支持此属性或方法 线路:1041 字符:25 代码:0 网址:http://example.com/?

消息:对象不支持此属性或方法 线路:1041 字符:25 代码:0 网址:http://example.com/?

注意::直接从 IE8 的调试器复制的错误

【问题讨论】:

  • ... 这些索引中的 arr 是什么?提出一个完整的问题。
  • 先生,它包含字符串值。
  • @user950146 '' 是一个字符串值。
  • 在这类示例中,将其复制到 jsfiddle.net 中很有用,这样我们可以帮助调试得更好
  • 输入arr[row][col].valueOf()会在控制台看到什么?

标签: javascript regex internet-explorer


【解决方案1】:

两个原因:您没有替换子字符串的出现,而是尝试在 DOM-Element 上使用字符串操作方法。最好这样做:

var value = arr[row][col].innerHTML.replace(new RegExp('"', 'g'),'""');

但在这种情况下,我真的不喜欢正则表达式(我喜欢正则表达式,但仅在需要时)。我会将所有" 替换为"",如下所示:

var value = arr[row][col].innerHTML.split('"').join('""');

更快、更易于阅读,并为您提供相同的结果。虽然要记住一件事:如果源字符串已经包含双引号 (""),这些将是四倍。如果这是一种可能的情况,您确实需要这样的正则表达式:

var value = arr[row][col].innerHTML.replace(/(?:[^"]"(?:[^"]))/g,'""');

这将只匹配既没有前面也没有后面的引号...选择上述任何一种解决方案,但请记住:如果您选择使用第一个选项,研究表明您会多出 50%可能有更少的朋友;-)。

【讨论】:

  • 感谢 Elias 试图帮助我。我想我发现了问题。不知何故,一个对象被作为字符串值循环中的值传递。我使用“typeof”关键字来过滤这些对象,现在它可以工作了。
  • 我不同意可读性声明,因为它是一种掩盖代码意图的黑客行为。此外,我无法生成 .split 始终更快的测试用例。我会选择var r = /"/g; ..loop.. { t.replace(r, '""'); }
  • 进一步测试表明..loop.. { t.replace(/"/g, '""'); } 将是执行此操作的最佳方式。显然,这些天浏览器 JS 引擎相当聪明:)。
  • @user950146:你的解释让我相信你实际上是在使用for - in 循环,这将传递方法、原型值以及实际属性,对于数组,你会更好使用for(var i=0;i<arr.length;i++) 循环。 @Bergius:可读性是一个习惯和偏好的问题,所以我不能在那里和你争论。更快:差异可以忽略不计,但我还没有彻底测试过。但作为一般规则,如果可能,我会尽量避免使用正则表达式。顺便说一句,在循环外构建正则表达式的好建议,user950146:在循环外创建正则表达式!
  • 确实如此。如果一个人需要/想要关心损坏的浏览器,那么所有的赌注都会被取消。我确实认为在循环外创建正则表达式会很聪明,但 FF 证明我错了——与拆分/连接和将正则表达式创建移出循环相比,循环内的正则表达式文字是一个巨大的改进。因此,@ user950146,如果您正在处理大量数据,则循环内的正则表达式文字:)。
猜你喜欢
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2012-01-04
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多