1

我需要得到一个只包含一对已定义标签之间的文本的字符串,以及一个由包含标签的文本组成的字符串。由于文本位于 HTML<p>标记中,因此<>被解释为&lt;&gt;(据我所知,这使得无法使用像 HTML Agility Pack 这样的解析器)

所以输入字符串看起来像这样:

Text outside of tags
&lt;internal&gt;    First occurance of text inside of tags    &lt;/internal&gt;
More text outside of tags
&lt;internal&gt;    Second occurance     &lt;/internal&gt;

我现在正在使用以下代码,但它只出现第一次而不是第二次:

Regex regex = new Regex(@"(&lt;internal&gt;(.*?)&lt;/internal&gt;)", RegexOptions.Singleline);
MatchCollection matches = regex.Matches(inputString);

foreach (Match match in matches)
{
    string outerMatch = match.Groups[1].Value;
    string innerMatch = match.Groups[2].Value;
}
4

3 回答 3

1

又是这样的问题。

不要使用正则表达式来识别标签。正则表达式是无状态的,不能与 HTML 或 XML正确操作。为此,您需要使用解析器。

使用敏捷包进行 HTML 解析。

于 2012-07-06T08:59:17.703 回答
1

哦,代码确实有效。它没有选择第二次出现的原因是在某些情况下,创建插入的文档和标签内文本的标签的编辑器,这使得正则表达式无法匹配它。我将正则表达式更改为:

Regex regex = new Regex(@"(&lt;.*?internal.*?&gt;(.*?)&lt;.*?/.*?internal.*?&gt;)", RegexOptions.Singleline);

不管怎么说,还是要谢谢你!

于 2012-07-06T10:54:02.987 回答
-1

使用\<and\>代替&lt;and&gt;

像这样:

(\<internal\>(.*?)\</internal\>)
于 2012-07-06T09:05:04.677 回答