簡體   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