【问题标题】:Regex named group issue正则表达式命名组问题
【发布时间】:2012-08-12 11:23:51
【问题描述】:

我有这段 HTML:

</TABLE>
<HR>
<font size="+1"> Method and apparatus for re-sizing and zooming images by operating directly
     on their digital transforms
</font><BR>

我正在尝试捕获font 标记内的文本。这是我的正则表达式:

  Regex regex = new Regex("</TABLE><HR><font size=\"+1\">(?<title>.*?)</font><BR>", RegexOptions.Singleline | RegexOptions.IgnoreCase);

        Match match = regex.Match(data);

        string title = match.Groups["title"].Value;

但是我得到空标题。谁能告诉我我错过了什么?

【问题讨论】:

  • 正则表达式是错误的工具。正则表达式无法以任何程度的可靠性解析 HTML(或 XML)。使用 HTML 解析器,请参阅 this question
  • @Richard:我明白这一点。但是,我要解析的网站具有固定的结构,因此我想使用 Regex 本身。

标签: c# .net html regex


【解决方案1】:

你的正则表达式;

new Regex("</TABLE><HR><font size=\"+1\">(?<title>.*?)</font><BR>"

由于+ 在正则表达式中具有不同的含义,因此格式不正确。

根据您输入的字符串,您真正想要的是将其转义;

new Regex("</TABLE><HR><font size=\"\\+1\">(?<title>.*?)</font><BR>"

另外,如果你想用换行符匹配字符串,你也必须给一个通配符来忽略它们,所以这可能是你想要做的更多;

new Regex("</TABLE>.*<HR>.*<font size=\"\\+1\">(?<title>.*?)</font>.*<BR>"

【讨论】:

  • 谢谢。但不明白你为什么要为多行做 .* ?当它是 RegexOptions.Singleline 时,它​​不会匹配所有内容吗?
  • @Jack RegexOptions.Singleline only 更改点 (.) 的含义,使其匹配每个字符(而不是除 \n 之外的每个字符)。 换句话说,您仍然需要将换行符与 .或 .* 忽略它。
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多