Bud*_*Joe 7 .net c# extension-methods parsing split
我想为.NET String类编写扩展方法.我希望它是Split方法的一个特殊的方法 - 在分隔符之前使用转义字符时,它采用转义字符来防止拆分字符串.
写这个的最好方法是什么?我很好奇最好的非正则表达式来接近它.
像签名一样的东西......
public static string[] Split(this string input, string separator, char escapeCharacter)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
更新: 因为它出现了一个评论,逃避......
在C#中转义非特殊字符时会出现错误 - CS1009:无法识别的转义序列.
在IE JScript中,转义转义字符.除非你尝试\ u然后你得到一个"预期的十六进制数字"错误.我测试了Firefox,它有相同的行为.
我希望这种方法非常宽容并遵循JavaScript模型.如果你在非分隔符上转义,它应该"善意"删除转义字符.
Jon*_*eet 12
怎么样:
public static IEnumerable<string> Split(this string input,
string separator,
char escapeCharacter)
{
int startOfSegment = 0;
int index = 0;
while (index < input.Length)
{
index = input.IndexOf(separator, index);
if (index > 0 && input[index-1] == escapeCharacter)
{
index += separator.Length;
continue;
}
if (index == -1)
{
break;
}
yield return input.Substring(startOfSegment, index-startOfSegment);
index += separator.Length;
startOfSegment = index;
}
yield return input.Substring(startOfSegment);
}
Run Code Online (Sandbox Code Playgroud)
这似乎有用(有一些快速测试字符串),但它不会删除转义字符 - 这将取决于你的确切情况,我怀疑.
这将需要清理一下,但这基本上是....
List<string> output = new List<string>();
for(int i=0; i<input.length; ++i)
{
if (input[i] == separator && (i==0 || input[i-1] != escapeChar))
{
output.Add(input.substring(j, i-j);
j=i;
}
}
return output.ToArray();
Run Code Online (Sandbox Code Playgroud)