2017-01-30 3 views
0

Ich habe die folgende Funktion Rückkehr:C# Regex mehrere Textzeilen

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; 
    } 

Wie Sie mir eine URL in dem "Abschlag" Format sehen zu definieren:

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

In der gleichen Weise, E-Mails werden auch in diesem Format geschrieben:

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

jedoch, wenn ich in einem mehrzeiligen String, mit mehreren E-Mail-Adressen weitergeben, es ret nur urns nur die erste E-Mail. Ich möchte, dass es mehrere Übereinstimmungen gibt, aber ich kann nicht scheinen, dass das funktioniert.

Zum Beispiel

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

Dies wird die erste E-Mail über nur zurückgeben?

+0

Die "Multiline" Regex Option ist für, wenn Sie '^' und '$' verwenden möchten, um den Anfang und das Ende einer Zeile und nicht den Anfang und das Ende der gesamten Zeichenfolge anzupassen. Wenn Sie diese Token nicht verwenden, ist diese Option bedeutungslos. – Abion47

Antwort

2

Der mailto:([^\?]*) Teil Ihrer Muster passend alles in Ihrer Eingabezeichenfolge. Sie müssen die Schließbügel ] an der Innenseite des ausgeschlossenen Zeichen hinzuzufügen, diesen Teil beschränken außerhalb des „Mailto“ Abschnitt und in den Text innerhalb der „url“ Tags aus überquell:

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

Siehe diesen Link für ein Beispiel: https://regex101.com/r/zcgeW8/1

+0

Danke @ Abion47. Das hat gut für mich funktioniert. Ich kann sehen, wie es jetzt zu allem passt – user1112324

0

Sie können das gewünschte Ergebnis mit Hilfe von positivem Lookahead und positivem Lookbehind extrahieren. Siehe http://www.rexegg.com/regex-lookarounds.html

Try regex: (?<=\[url=mailto:).*?(?=\])

Above Regex erfassen zwei E-Mail-Adressen aus Probe Zeichenfolge

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

Ergebnis:

[email protected] 
[email protected]