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