0

我有以下输入字符串

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# 匹配组或匹配集合作为匹配组?

4

2 回答 2

1

试试下面的正则表达式,它使用正面的向后看,

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

演示

>它查找紧随符号之后开始的标签。

解释:

  • (?<=>)此处使用正向lookbehind,它将匹配标记设置在>符号之后。
  • <文字<符号。
  • ([A-Z][A-Z0-9]*\b[^>]*>)捕捉到下一个>符号。
  • .*匹配除\n零次或多次以外的任何字符。
  • <\/\1>匹配中立</+第一个捕获的组+>
于 2014-07-15T05:44:51.030 回答
1

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

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

请参阅演示

解释

  • 在标签内部,在.*匹配太多字符的内部,我们使用[^<]*,它匹配任何不是开始标签的字符。这样我们就不会进入另一个标签。
  • 同样,我将您更改[^>]*为,[^<>]*因此我们不会开始另一个标签
  • 我假设你会让这个不区分大小写
于 2014-07-15T05:47:07.573 回答