簡體   English   中英

正則表達式C#可選組-應該貪心嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM