正则表达式强制匹配

时间:2010-07-28 21:59:58

标签: regex

好的,我得到了这个正则表达式:

^[\w\s]+=["']\w+['"]

现在正则表达式将匹配:

a href ='google'

a href =“google”

以及

a href ='google'

如何强制使用正则表达式来匹配其引用?
如果第一个报价是单引号,我怎样才能使最后一个报价也是单引号而不是双引号

5 个答案:

答案 0 :(得分:6)

了解backreferences

^[\w\s]+=(["'])\w+?\1

请注意,您希望在第二个?之后加上+,否则它会变得贪婪。但是,通常这不是解析HTML的正确方法。使用Beautiful Soup

答案 1 :(得分:0)

试试这个:

^[\w\s]+="\w+"|^[\w\s]+='\w+'

答案 2 :(得分:0)

恐怕你必须做很长的事情:

^[\w\s]+=("\w+"|'\w+')

从技术上讲,确保正确匹配/嵌套引号对于常规语法来说不是问题,因此对于更复杂的问题,您必须使用正确的解析器(或perl6样式扩展正则表达式,但它们在技术上不会作为正则表达式进行分类)。

答案 3 :(得分:0)

['"]替换为\1以使用反向引用(捕获组)

^[\w\s]+=["']\w+\1

答案 4 :(得分:0)

你想要匹配什么?听起来你想要匹配:

  • word(标记名)
  • 强制性空白
  • 字(attr name)
  • 可选空格
  • =
  • 可选空格
  • 单引号或双引号(attr value)

那将是:^(\w+)\s+(\w+)\s*=\s*(?:'([^']*)'|"([^"]*)")

这将允许匹配:

  • a href='' - 空attr
  • a href='Hello world' - 引用部分中的空格和其他非单词字符
  • a href="one 'n two" - 引用部分中不同类型的引号
  • a href = 'google' - =
  • 两侧的空格

并且禁止这些原始正则表达式允许的内容:

  • a b c href='google' - 额外的话
  • ='google' - 左侧只有空格
  • href='google' - 左边只有attr

它仍然听起来不完全正确 - 您是否尝试将标签与一个属性匹配?

使用此正则表达式,标记名称将位于$1中,attr名称位于$2中,而attr值位于$3$4中(另一个为零 - 最多语言区分未采用nil vs group采取的组,但如果需要则使用""清空。

如果你想在双重引用的attr值中允许单引号,那么确保attr值在同一组中的正则表达式会更加混乱 - 反之如同^(\w+)\s+(\w+)\s*=\s*(['"])((?:(?!\3).)*)\3(?!)为零宽度否定前瞻 - (?:(?!\3).)表示[^\3]之类的内容,但不支持后者。

如果你不关心这个^(\w+)\s+(\w+)\s*=\s*(['"])(['"]*)\3会很好(两个$3都是引用类型,$4 attr值)。

顺便说一下上面的(["'])\w+?\1 - \w与引号不匹配,因此?不会改变任何内容。

说了这么多,使用真正的HTML解析器; - )

这些正则表达式适用于Perl和Ruby。其他语言通常复制Perl的regexp系统,但通常会引入微小的更改,因此可能需要进行一些调整。尤其是负面预测的人可能不受支持。