1

所以,我有这样的文字:

<a href="/find/1">testing</a>
<strong>a known text</strong>
<p>testing2</p>
<p>this paragraphs are dynamically</p>
...
<a href="/find/2/">testing again</a>
<a href="/find/3/">testing and again</a>

我想获取已知文本下的所有href

我使用这个正则表达式来获取所有匹配项:(?<=<a\ href=")/find/.*?(?=") 但我也得到了结果:/find/1这是我不想要的结果。

我试过这个:a known tex[\w\W](?<=<a\ href=")/find/*?(?=")但它不起作用。我不知道如何正确完成这项工作。基本上我只想得到/find/2//find/3

PS:我并没有真正使用 C#,而是一个用 C# 制作并使用 C# 正则表达式的软件。

4

1 回答 1

1

我有这个正则表达式,它与 Marcin 的有点不同,但我不习惯在后视中使用可变长度的正则表达式:

var regex = new Regex(@"(?:a known text|(?<!^)\G)[\w\W]+?((?<=<a\ href="")/find/.*?(?=""))");

ideone演示

相信应该使正则表达式更有效率。

\G是一个特殊字符,它匹配上一个匹配结束的位置,因此在找到第一个之后/find/,它会再次尝试匹配。我不得不在后面放置一个否定的lookbehind以防止它也匹配换行符。

a known tex[\w\W](?<=<a\ href=")/find/*?(?=")

关于你的正则表达式,你犯的一些小错误是忘记了after的量词[\w\W]和点。使用只会得到你,这已经聊胜于无了!*?/find/a known tex[\w\W]+(?<=<a\ href=")(/find/.*?)(?=")/find/2/

编辑:正如 AlanMoore 正确指出的那样,您可以简化正则表达式:

var regex = new Regex(@"(?:a known text|(?<!^)\G)[\w\W]+?<a href=""(/find/.*?)""");

为了使.匹配换行符,我们可以使用(?s)和删除[\w\W]部分:

var regex = new Regex(@"(?s)(?:a known text|(?<!^)\G).*?<a href=""(/find/.*?)""");
于 2013-08-30T20:04:04.633 回答