また、正規表現を使用せずにこれを行うことができます。次の拡張メソッドを使用すると、エスケープシーケンスの開始と終了に区切り文字と文字を指定できます。すべてのエスケープシーケンスが閉じていることを検証しないことに注意してください。";事いくつかの"
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);
}
は、その後、次の
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);
いる間は、この出力に
"[email protected];,.'o"@hotmail.com
を与えます@ example.com
hello @ world
"D; D @何とか; blah.com"
ここでは、追加のシングルエスケープ文字で動作するバージョンがあります。 2つの連続したエスケープ文字が1つのエスケープ文字になるはずで、エスケープシーケンスの開始または終了をトリガーしないように、delimiter
をエスケープするようにbeginEndEscape
チャーターの両方をエスケープしていると仮定します。エスケープ文字の後に来るものは、エスケープ文字をそのままにしてそのまま残ります。
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();
}
最後に、あなたはおそらくnull
あなたは空の文字列を渡した場合の両方が1つの空の文字列でのシーケンスを返すことで渡された文字列とノートのチェックを追加する必要があります。
を与えるだろう私の提案は、あなたの区切り文字がどこにも境界をマークする以外は表示されませんことを確認するだろうメールの間に '; 'が含まれているメール(例:some; [email protected])は許されません。さもなければ、パイプ '|'のような別の区切り文字を見つけますか? – ray
レスキューには?多分あなたは適応することができます:http://stackoverflow.com/questions/7430186/regex-split-string-with-on-a-delimetersemi-colon-except-those-that-appear-in – Corak
次のようにしてください: '(^ |))(。*?)@([\ d \ w] + [ - ] *)+ \。\ w + ' – Camo