1

我想从 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”

4

1 回答 1

0

您的捕获组有点奇怪:[^(\s*|\>)]*是一个字符类,它将匹配任何字符 not (, ror a character class \s,也不是 asterisk*等。

但是,您可以做的是在捕获组之前和之后加上引号:

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

然后将字符类更改为[^"](不是引号):

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

正则表达式 101 演示

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

如果您想在某些情况下考虑单引号而根本不考虑引号,您可以试试这个:

<a\s*[^>]*\s*href\s*=\s*((?:[^ ]|[\n\r])+)\s*[^>]*>\s*Text\s*<\/a>

更新了 regex101

这个正则表达式有这部分,而不是(?:[^ ]|[\n\r])+接受非空格和换行符(以及回车以防万一)。请注意,它\s包含空格、制表符、换行符和换页符。

于 2013-08-29T06:33:05.997 回答