我试图从:
捕获“Rio Grande Do Leste”...
<h1>Rio Grande Do Leste<br />
...
使用
var myregexp = /<h1>()<br/;
var nomeAldeiaDoAtaque = myregexp.exec(document);
我做错了什么?
更新
仍有2个问题:
1)搜索(文档)没有产生任何结果,但将其更改为(document.body.innerHTML)有效。那是为什么?
2)我不得不将其更改为:myregexp.exec(document.body.innerHTML) [1] ;得到我想要的东西,否则它会给我一些包含<h1>
的结果。那是为什么?
3)(已回答)为什么我需要使用“。*”?我认为它会收集()之间的任何东西?
答案 0 :(得分:8)
尝试/<h1>(.*?)<br/
。
答案 1 :(得分:5)
捕获组尝试捕获匹配的内容。这有一些重要的后果:
这是一个包含2个捕获组的简单模式:
(\d+) (cats|dogs)
\___/ \_________/
1 2
鉴于i have 16 cats, 20 dogs, and 13 turtles
,有2个匹配项(as seen on rubular.com):
16 cats
匹配:第1组捕获16
,第2组捕获cats
20 dogs
匹配:第1组捕获20
,第2组捕获dogs
现在考虑对模式进行略微修改:
(\d)+ (cats|dogs)
\__/ \_________/
1 2
现在,组1匹配\d
,即一个数字。在大多数情况下,重复匹配的组(在这种情况下感谢+
)只能保持最后一个匹配。因此,在大多数风格中,只有匹配的最后一个数字由第1组(as seen on rubular.com)捕获:
16 cats
匹配:第1组捕获6
,第2组捕获cats
20 dogs
匹配:第1组捕获0
,第2组捕获dogs
现在让我们考虑匹配“A
和ZZ
之间的所有内容”的问题。事实证明,这个规范是模棱两可的:我们将提出3种模式来实现这一点,它们将产生不同的匹配。哪一个是“正确的”取决于期望,这在原始陈述中没有恰当地传达。
我们使用以下作为输入:
eeAiiZooAuuZZeeeZZfff
我们使用3种不同的模式:
A(.*)ZZ
产生1个匹配:AiiZooAuuZZeeeZZ
(as seen on ideone.com)
iiZooAuuZZeee
A(.*?)ZZ
产生1个匹配:AiiZooAuuZZ
(as seen on ideone.com)
iiZooAuu
A([^Z]*)ZZ
产生1个匹配:AuuZZ
(as seen on ideone.com)
uu
以下是他们匹配内容的直观表示:
___n
/ \ n = negated character class
eeAiiZooAuuZZeeeZZfff r = reluctant
\_________/r / g = greedy
\____________/g
参见相关问题,对这三种技术之间的差异进行更深入的处理。
.*?
and .*
for regex
让我们回到问题,看看模式有什么问题:
<h1>()<br
\/
1
组1匹配空字符串,因此整个模式总体上只能匹配<hr1><br
,而组1只能匹配空字符串。
人们可以尝试以许多不同的方式“修复”它。要尝试的3个显而易见的是:
<h1>(.*)<br
;贪婪<h1>(.*?)<br
;不愿<h1>([^<]*)<br
;否定角色等级你会发现以上都没有“工作”;某些HTML会出现问题。这是可以预料的:正则表达式是这项工作的“错误”工具。您可以尝试使模式变得越来越复杂,以便更频繁地“正确”地使用它,并且不那么频繁地“错误”地使用它。很可能你最终会遇到一个无法理解和/或维护的可怕混乱,并且它仍然可能在100%的时间内“正确”运行。
答案 2 :(得分:-1)