我的正则表达式做错了什么?

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)(已回答)为什么我需要使用".*"?我认为它会在()之间收集任何东西?

Wil*_*l A 8

试试/<h1>(.*?)<br/.


pol*_*nts 5

在捕获组

捕获组尝试捕获匹配的内容.这有一些重要的后果:

  • 一个什么都不匹配的小组永远无法捕获任何东西.
  • 只匹配空字符串的组只能捕获空字符串.
  • 在匹配尝试中反复捕获的组只能保留最后一次捕获
    • 对于大多数风格一般都是如此,但.NET正则表达式是一个例外(参见相关问题)

这是一个包含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捕获cats
  • 20 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捕获cats
  • 20 dogs是匹配:组1捕获0,组2捕获dogs

参考


关于贪婪与不情愿与否定的角色等级

现在让我们考虑匹配"之间的一切问题AZZ".事实证明,这个规范是模棱两可的:我们将提出3种模式来实现这一点,它们将产生不同的匹配.哪一个是"正确的"取决于期望,这在原始陈述中没有正确传达.

我们使用以下作为输入:

eeAiiZooAuuZZeeeZZfff
Run Code Online (Sandbox Code Playgroud)

我们使用3种不同的模式:

  • A(.*)ZZ产生1个匹配:AiiZooAuuZZeeeZZ(上ideone.com所见)
    • 这是贪婪的变种; 第1组匹配并捕获iiZooAuuZZeee
  • A(.*?)ZZ产生1个匹配:AiiZooAuuZZ(上ideone.com所见)
    • 这是不情愿的变种; 第1组匹配并捕获iiZooAuu
  • A([^Z]*)ZZ产生1个匹配:AuuZZ(上ideone.com所见)
    • 这是否定的字符类变体; 第1组匹配并捕获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%的时间内"正确"运行.