【问题标题】:JavaScript RegExp error - Nothing to repeat [duplicate]JavaScript RegExp 错误 - 无需重复 [重复]
【发布时间】:2015-04-29 07:41:02
【问题描述】:

我写了一个正则表达式来匹配 HTML 文本和它works in regex101.com

<h2>Dollarkurs\sAktuell<\/h2><\/div><div[^>?]+><div><table>
<colgroup><col[^>?]+><col><col[^>?]+><\/colgroup><tbody><tr>
<td[^>?]+>Kurs<\/td><td[^>?]+>([^\s^<?]+)\s*<span[^>?]+>
(\+|-)?\d+\,?\d{0,2}%<\/span><span[^>?]+><\/span><\/td>
<\/tr><tr><td[^>?]+>Kurszeit<\/td><td[^>?]+>
(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?\sUhr
<\/td><\/tr><tr><td[^>?]+>Kursdatum<\/td><td[^>?]+>([0-9\.]+)<\/td>

测试字符串是:

<h2>Dollarkurs Aktuell</h2></div><div class='content'><div><table>
<colgroup><col width='50px'><col><col width='100px'></colgroup><tbody><tr>
<td class='bold'>Kurs</td><td class='textRight' colspan='2'>1,0947 <span class='distanceLeft right green'>
+0,58%</span><span class='distanceLeft right imageIconPriceGreen'></span></td>
</tr><tr><td class='bold' colspan='2'>Kurszeit</td><td class='textRight'>
16:00:00 Uhr
</td></tr><tr><td class='bold' colspan='2'>Kursdatum</td><td class='textRight'>28.04.2015</td>

但是在程序中,我收到了这个错误:

未捕获的 SyntaxError:无效的正则表达式: 没有什么可重复的

这是我的代码:

var htmlTxt = "<h2>Dollarkurs Aktuell</h2></div><div class='content'><div><table><colgroup><col width='50px'><col><col width='100px'></colgroup><tbody><tr><td class='bold'>Kurs</td><td class='textRight' colspan='2'>1,0947 <span class='distanceLeft right green'>+0,58%</span><span class='distanceLeft right imageIconPriceGreen'></span></td></tr><tr><td class='bold' colspan='2'>Kurszeit</td><td class='textRight'>16:00:00 Uhr</td></tr><tr><td class='bold' colspan='2'>Kursdatum</td><td class='textRight'>28.04.2015</td>";

var re = new RegExp("<h2>Dollarkurs\sAktuell<\/h2><\/div><div[^>?]+><div><table><colgroup><col[^>?]+><col><col[^>?]+><\/colgroup><tbody><tr><td[^>?]+>Kurs<\/td><td[^>?]+>([^\s^<?]+)\s*<span[^>?]+>(\+|-)?\d+\,?\d{0,2}%<\/span><span[^>?]+><\/span><\/td><\/tr><tr><td[^>?]+>Kurszeit<\/td><td[^>?]+>(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?\sUhr<\/td><\/tr><tr><td[^>?]+>Kursdatum<\/td><td[^>?]+>([0-9\.]+)<\/td>", "gmi");

var result = re.exec(htmlTxt);

while (result != null)  {
  document.write("["+re.lastIndex+"] "+result);
  document.write("<br />");
 }

【问题讨论】:

  • 在这里提出整个问题。
  • 请将您的相关代码和错误信息贴在这里,不要链接到其他网站来描述您的问题。
  • @Biffen 这个答案很有趣,本身并没有错,但是使用正则表达式从预期的 HTML 中抓取值并没有错。他们没有尝试使用正则表达式解析 HTML。
  • @L3viathan 你和我显然有不同的意见:我会说使用正则表达式来抓取 HTML 肯定是有问题的。要么 HTML 片段每次都是完全相同的字符串,在这种情况下根本不需要刮掉它,或者(更有可能)它会随着时间的推移而改变,而正则表达式迟早会获胜不行。

标签: javascript regex


【解决方案1】:

不管模式是否正确:

而不是使用:

var re = new RegExp("\+", "gmi");

使用:

var re = /\+/gmi;

MDN - Creating a regular expression

如果您使用的是字符串构造函数,则需要对所有反斜杠进行字符串转义:

var re = new RegExp("\\+", "gmi");

正如 cmets 中已经提到的,使用正则表达式解析 HTML 是 not always a good idea尤其是在使用 JavaScript 的浏览器中,因为您已经处于一个巨大的 HTML 解析器的上下文中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2014-07-27
  • 2015-04-20
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多