【问题标题】:Simple Regex match question?简单的正则表达式匹配问题?
【发布时间】:2009-10-20 14:17:40
【问题描述】:

我有一个字符串流,里面有很多这样的字符串:

  <A style="FONT-WEIGHT: bold" id=thread_title_559960       href="http://microsoft.com/forum/f80/topicName-1234/">Beautiful Topic Name</A> </DIV> 

我正在尝试获取以下开头的适当链接:

style="FONT-WEIGHT: bold

所以最后我会有链接:

http://microsoft.com/forum/f80/topicName-1234/

Topic Id:
    1234

Topic Display Name:
    Beautiful Topic Name

I am using this pattern, right now, but it doesn't do it all:
    "href=\"(?<url>.*?)\">(?<title>.*?)</A>"

因为还有其他以href开头的链接。

为了使用正则表达式,我在一行字符串中添加了所有行。正则表达式是否关心新行? IE 可以继续匹配跨多行的字符串吗?

请帮我看看这个模式。

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    在正则表达式中,点通配符 匹配换行符。如果要匹配包括换行符在内的任何字符,请使用[^\x00] 而不是.。这匹配除了空字符之外的所有内容,这意味着它匹配所有内容。

    试试这个:

    <A\s+style="FONT-WEIGHT: bold"\s+id=(\S+)\s+href="([^"]*)">([^\x00]*?)</A>
    

    如果您尝试使用双引号将其分配给字符串,则需要转义引号和反斜杠。它看起来像这样:

    myVar = "<A\\s+style=\"FONT-WEIGHT: bold\"\\s+id=(\\S+)\\s+href=\"([^\"]*)\">([^\\x00]*?)</A>";
    

    【讨论】:

    • 谢谢,所以应该是:"href=\"(?*?)\">(?*?)"
    • @Joan Venge:不完全是。我通过修改您的正则表达式更新了我的答案。免责声明:我没有测试它。
    • "href=\"(?&lt;url&gt;[^\"]*)\"&gt;(?&lt;title&gt;[^&lt;]*)&lt;/A&gt;",以便不让“title”匹配其他标签(以及此后不相关的标签)。
    • 谢谢 Asaph,你能帮我做其他的比赛吗?我无法理解固定样式的字体字符串。
    • @Joan Venge:要匹配样式属性的内容,您可以尝试style="([^"]*)"。此模式应该适用于其他属性(当然,如果您将“样式”一词替换为适当的属性名称)。
    【解决方案2】:

    您可以使用RegexOptions.Singleline 枚举使模式中的. 匹配换行符:

    指定单行模式。变化 点 (.) 的含义,所以它 匹配每个字符(而不是 除了 \n) 之外的所有字符。

    因此,如果您的标题跨越多行,启用该选项后,模式的 (?&lt;title&gt;.*?) 部分将继续跨行尝试查找匹配项。

    【讨论】:

      最近更新 更多