2017-02-13 43 views
1

我怎樣才能讓這個C#正則表達式不包括在匹配結果的URL之前的第一個字符:C#正則表達式,比賽,但不包括第一個字符匹配之前的字符串

((?!\").)https?:\/\/twitter\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+) 

這將匹配:

Xhttps://twitter.com/oppomobileindia/status/798397636780953600 

注意第一個X字母。

我希望它匹配沒有雙引號的網址。對於那些不以雙引號開頭的網址,也不要在https之前加入第一個字符。

,我在我的代碼使用一個實際的例子:

var str = "<div id=\"content\"> 
      <p>https://twitter.com/oppomobileindia/status/798397636780953600</p> 
      <p>\"https://twitter.com/oppomobileindia/status/11111111111111111111</p></div>"; 

var pattern = @"(?<!""')https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+)";// 

var rgx = new Regex(pattern); 

var results = rgx.Replace(str, "XXX"); 

在上面的例子中,只有第一個URL應該是內容替換,因爲第二個擁有該URL前雙引號。它也應該在完全匹配的情況下被替換,沒有匹配字符串之前的第一個字母。

回答

2

使用(?<!")負回顧後:

var re = @"(?<!"")https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+)"; 

(?<!")意味着緊接在當前位置之前不能是"

在C#中,您不需要在模式內轉義/,因爲定義正則表達式時不使用正則表達式分隔符。

有關C#語法的注意事項:如果要在逐字字符串文字中定義",請將其加倍。在常規字符串文字,逃避"\

var re = "(?<!\")https?://twitter\\.com/(?:#!/)?(\\w+)/status(?:es)?/(\\d+)"; 
+0

它匹配之前它有一個雙引號的URL。我檢查了http://regexstorm.net/tester和我的正則表達式替換函數,它並沒有阻止帶有雙引號的URL在被替換之前。我會在一秒鐘內添加一個例子。 –

+0

我已經更新了我想要實現的問題。 1)匹配沒有第一個字符的URL。 2)不匹配以雙引號開頭的網址。感謝Wiktor幫助我。 –

+0

我發佈了確切的逐字字符串文字。我添加了關於正則表達式用法的註釋。 –

相關問題