Sie können dies auch tun, ohne reguläre Ausdrücke zu verwenden. Mit der folgenden Erweiterungsmethode können Sie ein Trennzeichen und ein Zeichen zum Starten und Beenden von Escape-Sequenzen angeben. Beachten Sie, dass nicht überprüft wird, dass alle Escape-Sequenzen geschlossen sind.
public static IEnumerable<string> SpecialSplit(
this string str, char delimiter, char beginEndEscape)
{
int beginIndex = 0;
int length = 0;
bool escaped = false;
foreach (char c in str)
{
if (c == beginEndEscape)
{
escaped = !escaped;
}
if (!escaped && c == delimiter)
{
yield return str.Substring(beginIndex, length);
beginIndex += length + 1;
length = 0;
continue;
}
length++;
}
yield return str.Substring(beginIndex, length);
}
Dann wurde die folgende
var input = "\"[email protected];,.'o\"@hotmail.com;\"some;thing\"@example.com;[email protected];\"D;[email protected];blah.com\"";
foreach (var address in input.SpecialSplit(';', '"'))
Console.WriteLine(v);
Während geben diesem Ausgang
"[email protected];,.'o"@hotmail.com
"etwas, das Ding" @ beispiel.com
hallo @ welt
"D; D @ blah; blah.com" ist
Hier ist die Version, die mit einem zusätzlichen Einzel Escape-Zeichen funktioniert. Es wird davon ausgegangen, dass zwei aufeinanderfolgende Escape-Zeichen zu einem einzigen Escape-Zeichen werden sollten und es sowohl der beginEndEscape
Charta entgeht, so dass es den Anfang oder das Ende einer Escape-Sequenz nicht auslöst, und es auch die delimiter
entkommt. Alles andere, was nach dem Escape-Zeichen folgt, wird beibehalten, wenn das Escape-Zeichen entfernt wird.
public static IEnumerable<string> SpecialSplit(
this string str, char delimiter, char beginEndEscape, char singleEscape)
{
StringBuilder builder = new StringBuilder();
bool escapedSequence = false;
bool previousEscapeChar = false;
foreach (char c in str)
{
if (c == singleEscape && !previousEscapeChar)
{
previousEscapeChar = true;
continue;
}
if (c == beginEndEscape && !previousEscapeChar)
{
escapedSequence = !escapedSequence;
}
if (!escapedSequence && !previousEscapeChar && c == delimiter)
{
yield return builder.ToString();
builder.Clear();
continue;
}
builder.Append(c);
previousEscapeChar = false;
}
yield return builder.ToString();
}
Schließlich sollten Sie wahrscheinlich null
für die Zeichenfolge Überprüfung hinzufügen, die in und beachten Sie übergeben wird, dass sowohl eine Sequenz mit einem leeren String zurück, wenn Sie in einem leeren String.
würde Mein Vorschlag sicherstellen, dass Ihr Begrenzungszeichen nicht irgendwo anders nicht auftauchen als die Grenze zu markieren zwischen E-Mails, so sollten E-Mails mit ';' als Teil ihres Namens (zB "einige; [email protected]") nicht erlaubt sein. Andernfalls finde ein anderes Trennzeichen, wie eine Pipe '|'? – ray
RegEx zur Rettung? Vielleicht können Sie anpassen: http://stackoverflow.com/questions/7430186/regex-split-string-with-on-a-delimetersemi-colon-except-those-that-appear-in – Corak
Versuchen Sie Folgendes: '(^ |;) (. *?) @ ([\ d \ w] + [-] *) + \. \ w + ' – Camo