[英]regex c# optional group - should act greedy?
正則表達式〜像這樣:
blablabla.+?(?:<a href="(http://.+?)" target="_blank">)?
如果要找到一個URL,我想捕獲一個URL ...找到內容,但沒有鏈接(捕獲始終為空)。 現在,如果我這樣刪除結尾的問號
blablabla.+?(?:<a href="(http://.+?)" target="_blank">)
這只會匹配結尾處有鏈接的內容...是2.40 am ...我不知道...
- 編輯 -
樣本輸入:
blablabla asd 1234t535 <a href="http://google.com" target="_blank">
預期輸出:
match 0:
group 1: <a href="http://google.com" target="_blank">
group 2: http://google.com`
我只想要“ http://google.com”或“”
您正在做一整串比賽嗎? 如果是這樣,請嘗試在第一個正則表達式的末尾添加.*
,並查看其匹配項。 第一個正則表達式的問題在於,由於.+?
,它可以匹配blablabla
之后的所有內容.+?
(導致空捕獲),但括號內的部分仍然不匹配的a
,除非它是在字符串的結束標記。 順便說一下,查看您的預期輸出,捕獲1將是URL; 整個HTML標記的括號由於開頭的?:
而無法捕獲。
您不需要。+? 在開始時,正則表達式仍然會搜索整個輸入
您還可以在空格后緊跟'>',這將限制您的比賽
(?:<a href="(http://.+?)" target="_blank".*?>)
是拖尾嗎? 原因:通過將其標記為可選,您就允許。+嗎? 抓住它。
blablabla.*(?:<a href="((http://)?.*)".+target="_blank".*>)
我修改了它咯... .+?
基本上與.*
相同,並且如果您的href中沒有任何內容(您表示想要的是“”),則需要使http以及尾隨的文本成為可選內容。 另外,最前面的target
.*
表示您至少有一個空格或字符,但可能有更多(多個空格或其他屬性)。 >
之前的.*
,表示后面可以有空格或其他屬性。
如果沒有<a href...>
,則根本不會匹配任何<a href...>
,但這就是您想要的,對嗎?
如果您不需要捕獲整個<a href...>
部分,則可以完全刪除(?: ... )
。
如果未按指定的順序列出屬性,則此操作將失敗...這是不能真正使用regex解析html的原因之一。 但是,如果您確定href總是會出現在目標之前,那么這應該可以滿足您的需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.