正则表达式获得所有匹配,包括较小的子匹配

时间:2014-07-15 05:42:25

标签: regex non-greedy

我有以下输入字符串

Testing <B><I>bold italic</I></B> text. 

以及正则表达式:

<([A-Z][A-Z0-9]*)\b[^>]*>.*</\1>

此正则表达式仅提供以下更大的匹配

<B><I>bold italic</I></B>

如何使用正则表达式来获得较小的匹配?

<I>bold italic</I>

我尝试使用非贪婪的运算符,但它也没有用。

是否可以使用类似java或c#匹配组或匹配集合将两者作为匹配组?

2 个答案:

答案 0 :(得分:1)

尝试下面使用正面lookbehind的正则表达式

(?<=>)<([A-Z][A-Z0-9]*)\b[^>]*>.*<\/\1>

DEMO

它会查找刚刚开始>符号的标记。

<强>解释

  • (?<=>)此处使用正面lookbehind,它在tp >符号之后设置匹配标记。
  • <文字<符号。
  • ([A-Z][A-Z0-9]*\b[^>]*>)捕获下一个>符号。
  • .*匹配除\n以外的任何字符零次或多次。
  • <\/\1>匹配</ +首次捕获的群组+ >

答案 1 :(得分:1)

您可能知道,许多人更喜欢使用DOM解析器来解析html。但是看看你现有的正则表达式,修复它,我会建议:

<([A-Z][A-Z0-9]*)\b[^<>]*>[^<]*</\1>

请参阅the demo

<强>解释

  • 在标记内部,.*内部匹配过多的字符,我们使用[^<]*,它匹配任何不是开始标记的字符。这样我们就不会进入另一个标签。
  • 同样,我将您的[^>]*更改为[^<>]*,因此我们不会启动另一个标记
  • 我假设你会使这个不区分大小写的