我需要取一个字符串并根据它们正在进行的字符类型将它拆分为一个数组。
所以如果你有“asd fds 1.4#3”,这将分成如下数组
stringArray[0] = "asd";
stringArray[1] = " ";
stringArray[2] = "fds";
stringArray[3] = " ";
stringArray[4] = "1";
stringArray[5] = ".";
stringArray[6] = "4";
stringArray[7] = "#";
stringArray[8] = "3";
有关实现此目标的最佳方法的任何建议吗?当然,我可以创建一个基于.ToCharArray()的循环,但是正在寻找一种更好的方法来实现这一目标。
谢谢
答案 0 :(得分:1)
使用正则表达式:
var mc = Regex.Matches("asd fds 1.4#3", @"([a-zA-Z]+)|.");
var res = new string[mc.Count];
for (var i = 0; i < mc.Count; i++)
{
res[i] = mc[i].Value;
}
答案 1 :(得分:1)
这个程序可以产生你想要的输出,但是我不确定它是否足以满足你的目标。
class Program
{
private static void Main(string[] args)
{
var splited = Split("asd fds 1.4#3").ToArray();
}
public static IEnumerable<string> Split(string text)
{
StringBuilder result = new StringBuilder();
foreach (var ch in text)
{
if (char.IsLetter(ch))
{
result.Append(ch);
}
else
{
yield return result.ToString();
result.Clear();
yield return ch.ToString(CultureInfo.InvariantCulture);
}
}
}
}
答案 2 :(得分:1)
使用正则表达式和链接的组合,您可以执行以下操作。
using System.Text.RegularExpressions;
using System.Linq;
var str="asd fds 1.4#3";
var regex=new Regex("([A-Za-z]+)|([0-9]+)|([.#]+)|(.+?)");
var result=regex.Matches(str).OfType<Match>().Select(x=>x.Value).ToArray();
添加其他捕获组以捕获其他差异。最后一次捕获(.+?)
是非贪婪的一切。因此,此捕获中的每个项目都将被视为不同(包括两次相同的项目)
更新 - 正则表达式的新版本
var regex=new Regex(@"(?:[A-Za-z]+)|(?:[0-9]+)|(?:[#.]+)|(?:(?:(.)\1*)+?)");
现在使用非捕获组,以便\1
可用于最终捕获。这意味着如果相同的字符在其中捕获所有组,则将对其进行分组。
e.g。在字符串“asd fsd”之前将创建4个字符串(每个空格将被视为不同),现在结果是3个字符串,因为2个相邻的空格被组合