2017-01-30 132 views
0

的多行,我有以下功能:C#正則表達式返回文本

public static string ReturnEmailAddresses(string input) 
    { 

     string regex1 = @"\[url="; 
     string regex2 = @"mailto:([^\?]*)"; 
     string regex3 = @".*?"; 
     string regex4 = @"\[\/url\]"; 

     Regex r = new Regex(regex1 + regex2 + regex3 + regex4, RegexOptions.IgnoreCase | RegexOptions.Multiline); 
     MatchCollection m = r.Matches(input); 
     if (m.Count > 0) 
     { 
      StringBuilder sb = new StringBuilder(); 
      int i = 0; 
      foreach (var match in m) 
      { 
       if (i > 0) 
        sb.Append(Environment.NewLine); 
       string shtml = match.ToString(); 
       var innerString = shtml.Substring(shtml.IndexOf("]") + 1, shtml.IndexOf("[/url]") - shtml.IndexOf("]") - 1); 
       sb.Append(innerString); //just titles      
       i++; 
      } 

      return sb.ToString(); 
     } 

     return string.Empty; 
    } 

正如你可以看到我在「降價」的格式定義網址:

[url = http://sample.com]sample.com[/url] 

以同樣的方式,電子郵件是寫在格式太:

[url=mailto:[email protected]][email protected][/url] 

但是當我通過一個多串,用多個電子郵件地址,它只是漚只有第一封電子郵件。我希望它有多重匹配,但我似乎無法得到那個工作?

例如

[url=mailto:[email protected]][email protected][/url] /r/n a whole bunch of text here /r/n more stuff here [url=mailto:[email protected]][email protected][/url] 

這隻會返回上面的第一封電子郵件?

+0

「Multiline」正則表達式選項用於當您想使用'^'和'$'來匹配一行的開始和結束,而不是整個字符串的開始和結束時。如果你不使用這些令牌,那麼這個選項就沒有意義。 – Abion47

回答

2

你的模式的mailto:([^\?]*)部分匹配輸入字符串中的所有內容。您需要右括號]添加到您排除的字符裏到溢出了「電子郵件地址」部分的「URL」標籤中之外,進入文本限制部分:

\[url=mailto:([^\?\]]*).*?\[\/url\] 

請參閱此鏈接例如:https://regex101.com/r/zcgeW8/1

+0

謝謝@ Abion47。這對我來說很好。我可以看到它現在如何匹配一切 – user1112324