0

我需要获取一个字符串,并根据与他们进行的字符类型不匹配的字符将其拆分为一个数组。

因此,如果您有“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() 的循环,但我正在寻找一种更好的方法来实现这一点。

谢谢

4

3 回答 3

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);
            }
        }
    }

}
于 2012-07-31T15:40:38.173 回答
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可以在最终捕获中使用。这意味着如果同一字符在然后捕获所有组,则将对其进行分组。

例如,在字符串“asd fsd”将创建 4 个字符串(每个空格将被认为是不同的)之前,现在结果是 3 个字符串,因为 2 个相邻的空格被组合在一起

于 2012-07-31T15:41:24.370 回答
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;
}
于 2012-07-31T15:31:35.953 回答