Javascript 这个JS正则表达式在IE7和IE8中失败,但在IE9中失败,这又如何呢?

Javascript 这个JS正则表达式在IE7和IE8中失败,但在IE9中失败,这又如何呢?,javascript,regex,internet-explorer,internet-explorer-8,internet-explorer-7,Javascript,Regex,Internet Explorer,Internet Explorer 8,Internet Explorer 7,我以为社区帮我解决了不区分大小写的RegExp,但我弄错了。下面的正则表达式在IE7和IE8中失败了吗 var reggy = /(\s*?)<span\b(?:.*?)(?:class=(?:'|"|.*?\s)?foobar(?:\s|\3))(?:.*?)(?:\/)?>(.+?)<\/span>(\s*?)/ig; var reggy=/(\s*?)\3看起来可疑,因为第三个捕获组跟随它,所以它只能匹配空字符串。IE是否可以将第三个捕获组之前的\3视为八进制逃逸

我以为社区帮我解决了不区分大小写的RegExp,但我弄错了。下面的正则表达式在IE7和IE8中失败了吗

var reggy = /(\s*?)<span\b(?:.*?)(?:class=(?:'|"|.*?\s)?foobar(?:\s|\3))(?:.*?)(?:\/)?>(.+?)<\/span>(\s*?)/ig;

var reggy=/(\s*?)
\3
看起来可疑,因为第三个捕获组跟随它,所以它只能匹配空字符串。IE是否可以将第三个捕获组之前的
\3
视为八进制逃逸,即等同于
\u0003


在旧版本的IE中,
\s
有一个非标准的含义——例如,它与
\u00A0
不匹配。

\3
看起来可疑,因为它永远都不能匹配空字符串,因为第三个捕获组跟随它。IE是否可以将第三个捕获组之前的
\3
视为八进制逃逸,即等同于
\u0003


在旧版本的IE中,
\s
有一个非标准的含义——例如,它与
\u00A0
不匹配。

该正则表达式有几个问题,最糟糕的是,您似乎混淆了捕获组和非捕获组。正如Mike Samuel所暗示的,第三个捕获组是最末端的
(\s*?)
(与最开始的组一样,没有任何用处)。试试这个正则表达式:

/<span\b[^>]*\bclass=\s*(['"]?)forbes_entity\1[^>]*>[\s\S]*?<\/span>/ig
/]*\bclass=\s*(['“])福布斯实体\1[^>]*>[\s\s]*?/ig
这里只有一个捕获组;它捕获一个单引号、一个双引号或什么都没有。在类名之后,
\1
再次匹配相同的内容。(我更改了类名以匹配您的示例文本。)


事实证明,我不需要任何其他组,但如果我需要它们,我会使用非捕获组(
(?:…)
),以便更轻松地跟踪捕获组编号。我还使用了
[\s\s]
而不是
,以匹配span的内容,以防它包含任何换行符。

该正则表达式有几个问题,最糟糕的是您似乎混淆了捕获组和非捕获组。正如Mike Samuel暗示的,第三个捕获组是最后的
(\s*?)
(就像一开始一样,没有任何用处)。试试这个正则表达式:

/<span\b[^>]*\bclass=\s*(['"]?)forbes_entity\1[^>]*>[\s\S]*?<\/span>/ig
/]*\bclass=\s*(['“])福布斯实体\1[^>]*>[\s\s]*?/ig
这里只有一个捕获组;它捕获一个单引号、一个双引号或什么都没有。在类名之后,
\1
再次匹配相同的内容。(我更改了类名以匹配您的示例文本。)


事实证明,我不需要任何其他组,但如果我需要它们,我会使用非捕获组(
(?:…)
),以便更轻松地跟踪捕获组编号。我还使用了
[\s\s]
而不是
来匹配span的内容,以防它包含任何新行。

只是猜测:
(?:)
你想做什么?也许正则表达式不是最好的解决方案。这看起来像是一个可笑的正则表达式,没有必要让一切都变得过于复杂,你应该按程序来做。你还想用正则表达式来识别html,这是错误的。我看过那篇文章。我不是试图解析HTML文档时,我正在尝试模式匹配单个HTML节点。你认为我应该使用HTML解析器吗?从
(?:class=(?:“|”)“|*?\s)更改为
(class=('|“|*?\s)?foobar
正在发挥作用。仍然不知道为什么。只是想猜一下:
(?:)
你想做什么?也许正则表达式不是最好的解决方案。这看起来像是一个可笑的正则表达式,没有必要让一切都变得过于复杂,你应该按程序来做。你还想用正则表达式来识别html,这是错误的。我看过那篇文章。我不是试图解析HTML文档时,我正在尝试模式匹配单个HTML节点。您认为我应该使用HTML解析器吗?从
(?:class=(?:'|“|*?\s)更改为
(class=('|“|*)\s)?foobar
正在玩这个把戏。仍然不知道为什么。或者老IE将其视为一个错误,因为它是一个正向引用。我认为ECMAScript标准说它应该在不消耗任何字符的情况下成功,因为它引用的组还没有参与匹配。也许IE没有遵循这个r“以前是这样的。@Alanmore,我以为规范中说组的初始值是空的,并且每次输入包含重复项时都会重置,但我想这得出了相同的结论。或者旧的IE将其视为错误,因为它是正向引用。我想ECMAScript标准说它应该成功。”eed不使用任何字符,因为它引用的组尚未参与匹配。可能IE以前没有遵循该规则。@Alanmore,我认为规范中说组的初始值为空,并且每次输入包含重复项时都会重置,但我想这得出了相同的结论。谢谢r建议。我还尝试了一些不同的捕获组,我注意到一件有趣的事情是,捕获组的数量似乎是有限制的。拥有较少的捕获组本身可能是值得的,但如果有一些限制的话,这尤其是真的。谢谢你的建议。我还尝试了一些不同的捕获组我们捕获群体,我注意到一件有趣的事情是,捕获群体的数量似乎是有限制的。拥有更少的群体本身可能是值得的,但如果情况是有一些限制的话,这尤其是事实。