繁体   English   中英

如何在分隔符上分割字符串,并将分隔符保留为结果数组中的元素?

[英]How can I split a string on separators, and keep the separators as elements in the resulting array?

在此站点上以两种方式提出了这个问题:第一种方法实际上是一个不同的问题; OP希望将分隔符保留在结果元素的末尾/开头。 第二个问题收到一个答案,其中包含一个我不知道如何扩展的正则表达式。

我正在寻找一种在分隔符上拆分字符串的方法,其中分隔符将作为元素包含在结果数组中。 请说明如何为该功能选择自定义分隔符(最有可能是正则表达式)。

您可以使用正则表达式指定带有前瞻性或后瞻性的空表达式。

例如,假设您希望将字符串拆分为以下任意字符:

'(' ' ' ',' ')' '*' '/' '+' '-'

然后,您可以构造一个在前瞻性或lookbehind子句(即(?=...)(?<=...) )中列出它们的表达式,并使用Regex.Split进行Regex.Split ,如下所示:

string input = "12 / 34+(45-56)*678";
string pattern = "(?=[( ,)*/+-])|(?<=[( ,)*/+-])";

string[] substrings = Regex.Split(input, pattern);
foreach (string match in substrings) {
    Console.WriteLine("'{0}'", match);
}

演示

运行此命令将产生以下输出:

'12'
' '
'/'
' '
'34'
'+'
'('
'45'
'-'
'56'
')'
'*'
'678'

注意如何包括所有分隔符,以及空格,括号和运算符。

您仍然可以使用string.Split 并将分隔符保留在数组中。 请参阅以下扩展方法:

public static class StringExtensions
{
    public static string[] SplitAndKeep(this string s, string[] seperators)
    {
        string[] obj = s.Split(seperators, StringSplitOptions.None);
        List<string> result = new List<string>(obj.Length * 2 - 1);

        for (int i = 0; i < obj.Length; i++)
        {
            result.Add(obj[i]);
            if (i < obj.Length - 1) result.Add(separator);
        }
        return result.ToArray();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM