用于查找锚标记的正则表达式由c#.net中的新行组成

时间:2013-08-29 06:23:32

标签: c# .net regex

我想从achore标签中找到href。所以我使用了正则表达式

 <a\s*[^>]*\s*href\s*\=\s*([^(\s*|\>)]*)\s*[^>]*>\s*Text\s*<\/a>
 Options = Ignorecase + singleline

实施例

    <a href="/abc/xzy/pqr.com" class="m">Text</a>
So Group[1]="/abc/xzy/pqr.com"

但如果内容像

那样
     <a href="/abc/xzy/                     //Contains new line
    pqr.com" class="m">Text</a>  


so Group[1]="/abc/xzy/

所以我想知道如果内容包含新行(\ r \ n)

,如何获取“/abc/xzy/pqr.com”

1 个答案:

答案 0 :(得分:0)

您的捕获组有点奇怪:[^(\s*|\>)]*是一个字符类,它将匹配任何不是(的字符,字符类\s和星号{{1}等等。

然而,你可以做的是在捕获组之前和之后加上引号:

*

然后将字符类更改为<a\s*[^>]*\s*href\s*\=\s*"([^(\s*|\>)]*)"\s*[^>]*>\s*Text\s*<\/a> ^ ^ (不是引号):

[^"]

regex101 demo

这就是说,最好使用正确的html解析器而不是正则表达式。只是因为你可以忘记很多不同的场景,所以制作一个合适的正则表达式会更加繁琐,但如果你确定你的数据是如何通过的,那么正则表达式可能是获得你需要的快速方法。

如果你想在某些情况下考虑单引号而没有引号,你可以尝试这样做:

<a\s*[^>]*\s*href\s*\=\s*"([^"]*)"\s*[^>]*>\s*Text\s*<\/a>
                           ^^^^

Updated regex101

这个正则表达式有这个部分而不是<a\s*[^>]*\s*href\s*=\s*((?:[^ ]|[\n\r])+)\s*[^>]*>\s*Text\s*<\/a> ,它接受​​非空格和换行符(并且以及以后的回车)。请注意,(?:[^ ]|[\n\r])+包含空格,制表符,换行符和换页符。