【问题标题】:Extracting value from string从字符串中提取值
【发布时间】:2012-11-06 21:28:57
【问题描述】:

我在从 html 代码中提取字符串时遇到问题(这基本上是正则表达式的问题)。 代码如下:

string wheretosearch = @"
<td class=""name"">
<div>
<a href=""/addr1.html"" class=""link "">
<span>Title1</span>
</a></td>

[some code]

<td class=""name"">
<div>
<a href=""/addr2.html"" class=""link "">
<span>Title2</span>
</a></td>";

我想提取标签之间的标题。我的问题是我不能将未知数量的字符放入正则表达式(.* td class=""name"" 之后的部分):

<td class=""name"">.*<span>(?<title>.*)</span>

简单地说:我希望正则表达式找到&lt;td class=""name""&gt;,然后在未知数量的字符之后找到&lt;span&gt;的第一次出现,然后取第一个&lt;span&gt;&lt;/span&gt;之间的值。

它实际上做了什么,它需要最后一次出现 &lt;span&gt; 并只给出最后一个标题。

编辑:

好的,除了 HTML 问题,问题是这样的: 我有字符串:

“这是一个文本:NICE。这是一个很棒的文本:NICE TOO。”

我想取“This”,然后是未知数量的字符,然后是“:”和“.”之间的字符串。这是怎么做到的?

当然,我对那个复杂表达式的每次出现都感兴趣,所以输出将是集合中的“NICE”和“NICE TOO”。

对于像"This.*(?&lt;title&gt;.*)." 这样的表达式,我只得到“NICE TOO”字符串,正如@urlreader 提到的,它会找到最大长度匹配的字符串。

【问题讨论】:

  • 使用正则表达式进行 html 解析不是一个好主意。使用Html Agility Pack
  • 敏捷包+1,效果非常好,几乎可以吞下你扔给它的任何垃圾。
  • 感谢 HTML 问题的提示,但就像在 EDIT 中一样,我认为它比 HTML 问题更多的是正则表达式问题,尽管我不再使用正则表达式处理 HTML ;)

标签: c# regex string


【解决方案1】:

对于编辑中的问题,我会尝试类似:

This[\w|\s]*: (?<title>[\w|\s]+)\.

请记住,您必须在末尾转义点。

c# 中的正则表达式所需的一切都是here

一个方便的工具:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

【讨论】:

    【解决方案2】:
    <td class=""name"">.*?<span>(?<title>.*)</span>
    

    这是因为正则表达式试图找到最大长度匹配的字符串。

    【讨论】:

    • 好的,谢谢,除了 HTML 问题:“这是一个文本:NICE。这是一个很棒的文本:NICE TOO。”我想取“This”,然后是未知数量的字符,然后是“:”和“。”之间的字符串。如何做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 2019-01-30
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多