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

时间:2010-07-04 17:43:50

标签: javascript html regex capturing-group

我试图从:

捕获“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)(已回答)为什么我需要使用“。*”?我认为它会收集()之间的任何东西?

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

关于捕获组

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

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

这是一个包含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

参考


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

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

我们使用以下作为输入:

eeAiiZooAuuZZeeeZZfff

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

  • A(.*)ZZ产生1个匹配:AiiZooAuuZZeeeZZas seen on ideone.com
    • 这是贪心变种;第1组匹配并捕获iiZooAuuZZeee
  • A(.*?)ZZ产生1个匹配:AiiZooAuuZZas seen on ideone.com
    • 这是不情愿的变体;第1组匹配并捕获iiZooAuu
  • A([^Z]*)ZZ产生1个匹配:AuuZZas seen on ideone.com
    • 这是否定字符类变体;第1组匹配并捕获uu

以下是他们匹配内容的直观表示:

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g

参见相关问题,对这三种技术之间的差异进行更深入的处理。

相关问题


回到问题

让我们回到问题,看看模式有什么问题:

<h1>()<br
    \/
     1

组1匹配空字符串,因此整个模式总体上只能匹配<hr1><br,而组1只能匹配空字符串。

人们可以尝试以许多不同的方式“修复”它。要尝试的3个显而易见的是:

  • <h1>(.*)<br;贪婪
  • <h1>(.*?)<br;不愿
  • <h1>([^<]*)<br;否定角色等级

你会发现以上都没有“工作”;某些HTML会出现问题。这是可以预料的:正则表达式是这项工作的“错误”工具。您可以尝试使模式变得越来越复杂,以便更频繁地“正确”地使用它,并且不那么频繁地“错误”地使用它。很可能你最终会遇到一个无法理解和/或维护的可怕混乱,并且它仍然可能在100%的时间内“正确”运行。

答案 2 :(得分:-1)

^(<h1>)(.)+(<br />)

去这里测试 gskinner.com