1

在 Java 中有一个方法splitByCharacterType,它接受一个字符串,例如0015j8*(,并将其拆分为"0015","j","8","*","(". c#中有这样的内置函数吗?如果不是,我将如何构建一个功能来做到这一点?

4

3 回答 3

3
public static IEnumerable<string> SplitByCharacterType(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentNullException(nameof(input));

    StringBuilder segment = new StringBuilder();
    segment.Append(input[0]);
    var current = Char.GetUnicodeCategory(input[0]);

    for (int i = 1; i < input.Length; i++)
    {
        var next = Char.GetUnicodeCategory(input[i]);
        if (next == current)
        {
            segment.Append(input[i]);
        }
        else
        {
            yield return segment.ToString();
            segment.Clear();
            segment.Append(input[i]);
            current = next;
        }
    }
    yield return segment.ToString();
}

用法如下:

string[] split = SplitByCharacterType("0015j8*(").ToArray();

结果是"0015","j","8","*","("

我建议您将其作为扩展方法来实现。

于 2012-11-25T04:10:54.990 回答
2

我不认为这种方法存在。您可以按照以下步骤创建自己的实用程序方法:

  1. 创建一个列表来保存拆分字符串
  2. 使用所有字符类型定义字符串,例如

     string numberString = "0123456789";
     string specialChars = "~!@#$%^&*(){}|\/?";
     string alphaChars = "abcde....XYZ";
    
  3. 定义一个变量来保存临时字符串
  4. 定义一个变量来记录字符的类型
  5. 遍历您的字符串,一次一个字符,通过检查预定义类型字符串中是否存在字符来检查字符的类型。
  6. 如果类型比前一个类型新(检查类型变量值),则将临时字符串(非空)添加到列表中,将新类型分配给类型变量并将当前字符分配给临时字符串。如果不是这样,则将 char 附加到临时字符串。
  7. 在遍历结束时,将临时字符串(非空)添加到列表中
  8. 现在您的列表包含拆分字符串。
  9. 将列表转换为字符串数组,您就完成了。
于 2012-11-25T04:00:28.647 回答
0

您也许可以使用正则表达式类,如下所示,但您需要添加对数字和字母以外的其他字符的支持。

   var chars = Regex.Matches("0015j8*(", @"((?:""[^""\\]*(?:\\.[^""\\]*)*"")|[a-z]|\d+)").Cast<Match>().Select(match => match.Value).ToArray(); 

结果 0015,J,8

于 2012-11-25T04:08:17.987 回答