这个问题在本网站上有两个问题:第一种方式实际上是一个不同的问题; OP希望将分隔符保留在结果元素的结尾/开头。第二个问题得到了一个答案,其中包括一个我无法理解如何扩展的正则表达式。
我正在寻找一种在分隔符上分割字符串的方法,其中分隔符将作为元素包含在结果数组中。请解释我如何为此功能选择自定义分隔符(最有可能是正则表达式)。
答案 0 :(得分:4)
您可以使用指定带有前瞻或后瞻的空表达式的正则表达式。
例如,我们假设您希望将字符串拆分为以下任何字符:
'(' ' ' ',' ')' '*' '/' '+' '-'
然后你可以构造一个表达式,在lookahead或lookbehind子句中列出它们(即(?=...)
或(?<=...)
),并使用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'
注意如何包含所有分隔符,以及空格,圆括号和运算符。
答案 1 :(得分:0)
您仍然可以使用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();
}
}