これは、このSO質問の拡張です。この質問は、元の質問とは対照的に、2つの異なる囲み文字を考慮しています。
任意の数の(白い)スペースで分割したいのですが、<>AND""の間のすべてを無視します。したがって、この文字列:
string Line = "1 2 <1 2> \"hello world\" 3";
結果は次のようになります。
1、2、<1 2>、「hello world」、3
これは、このSO質問の拡張です。この質問は、元の質問とは対照的に、2つの異なる囲み文字を考慮しています。
任意の数の(白い)スペースで分割したいのですが、<>AND""の間のすべてを無視します。したがって、この文字列:
string Line = "1 2 <1 2> \"hello world\" 3";
結果は次のようになります。
1、2、<1 2>、「hello world」、3
の代わりにSplit
、使用しますMatches
string Line = "1 2 <1 2> \"hello world\" 3";
var parts = Regex.Matches(Line, @"[<\""]{1}[\w \d]+?[>\""]{1}|[\w\d]+")
.Cast<Match>()
.Select(m=>m.Value)
.ToArray();
PS: これは にも一致し"abc def>
ます。しかし、正規表現を短くするために無視しました
これは私がこれまでに思いついたものです:
public static string[] GetSplitStrings(string input)
{
IList<string> splitStrings = new List<string>();
var counter = 0;
var sb = new StringBuilder();
var inLessGreater = false; // sometimes <> can contain "
foreach (var character in input)
{
if (character.Equals('<'))
{
inLessGreater = true;
counter++;
}
if (character.Equals('>'))
{
inLessGreater = false;
counter++;
}
if (character.Equals('"') && !inLessGreater)
{
counter++;
}
if ((character.Equals(' ') && counter == 0) || (counter == 2))
{
if (sb.ToString().Equals("") == false)
{
if (character.Equals('"') || character.Equals('>'))
{
sb.Append(character);
}
splitStrings.Add(sb.ToString());
}
sb.Clear();
counter = 0;
}
else
{
sb.Append(character);
}
}
return splitStrings.ToArray();
}
きちんとした正規表現ソリューションを好むでしょう。