繁体   English   中英

RegEx匹配已知字符串之间以及带有换行符的已知文本之后的字符串

[英]RegEx match string between known strings and after a known text with line breaks

所以,我有这段文字:

<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#正则表达式的软件。

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

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

ideone演示

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

\\G是一个特殊字符,它与先前的匹配结束处匹配,因此在找到第一个/find/ ,它将再次尝试匹配。 为了避免它也不能与换行符匹配,我不得不在后面放一个负面的表情。

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

关于正则表达式,您犯的一些小错误是忘记了[\\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/.*?)""");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM