我将字符串拆分为三个不同的字符,但我希望输出包含我分割的字符。有没有简单的方法呢?
答案 0 :(得分:143)
如果分组字符为,
,.
和;
,我会尝试:
string[] parts = Regex.Split(originalString, @"(?<=[.,;])")
(?<=PATTERN)
是PATTERN
的正面观察。它应该在前面的文本适合PATTERN
的任何地方匹配,因此在每次出现任何字符后都应该匹配(和分割)。
答案 1 :(得分:24)
从BFree的答案开始,我有相同的目标,但我想分割一个类似于原始Split方法的字符数组,而且每个字符串也有多个分割:
public static IEnumerable<string> SplitAndKeep(this string s, char[] delims)
{
int start = 0, index;
while ((index = s.IndexOfAny(delims, start)) != -1)
{
if(index-start > 0)
yield return s.Substring(start, index - start);
yield return s.Substring(index, 1);
start = index + 1;
}
if (start < s.Length)
{
yield return s.Substring(start);
}
}
答案 2 :(得分:19)
以防万一有人想要这个答案......
您可以使用string[] parts = Regex.Split(originalString, @"(?<=[.,;])")
代替string[] parts = Regex.Split(originalString, @"(?=yourmatch)")
,而yourmatch
就是您的分隔符。
假设原始字符串是
777-猫
777 - 狗
777 - 鼠标
777 - 老鼠
777 - 狼 Regex.Split(originalString, @"(?=777)")
会返回
777 - 猫
777 - 狗
等等
答案 3 :(得分:3)
这似乎有效,但未经过多次测试。
public static string[] SplitAndKeepSeparators(string value, char[] separators, StringSplitOptions splitOptions)
{
List<string> splitValues = new List<string>();
int itemStart = 0;
for (int pos = 0; pos < value.Length; pos++)
{
for (int sepIndex = 0; sepIndex < separators.Length; sepIndex++)
{
if (separators[sepIndex] == value[pos])
{
// add the section of string before the separator
// (unless its empty and we are discarding empty sections)
if (itemStart != pos || splitOptions == StringSplitOptions.None)
{
splitValues.Add(value.Substring(itemStart, pos - itemStart));
}
itemStart = pos + 1;
// add the separator
splitValues.Add(separators[sepIndex].ToString());
break;
}
}
}
// add anything after the final separator
// (unless its empty and we are discarding empty sections)
if (itemStart != value.Length || splitOptions == StringSplitOptions.None)
{
splitValues.Add(value.Substring(itemStart, value.Length - itemStart));
}
return splitValues.ToArray();
}
答案 4 :(得分:3)
很多答案!一个我被各种字符串分开(原始答案仅适用于字符,即长度为1)。这尚未经过全面测试。
public static IEnumerable<string> SplitAndKeep(string s, params string[] delims)
{
var rows = new List<string>() { s };
foreach (string delim in delims)//delimiter counter
{
for (int i = 0; i < rows.Count; i++)//row counter
{
int index = rows[i].IndexOf(delim);
if (index > -1
&& rows[i].Length > index + 1)
{
string leftPart = rows[i].Substring(0, index + delim.Length);
string rightPart = rows[i].Substring(index + delim.Length);
rows[i] = leftPart;
rows.Insert(i + 1, rightPart);
}
}
}
return rows;
}
答案 5 :(得分:1)
result = originalString.Split(separator);
for(int i = 0; i < result.Length - 1; i++)
result[i] += separator;
(编辑 - 这是一个错误的答案 - 我误解了他的问题,并没有看到他被多个角色分裂。)
(编辑 - 正确的LINQ版本很难,因为分隔符不应该连接到拆分数组中的最后一个字符串。)
答案 6 :(得分:1)
最近我写了一个扩展方法做到这一点:
public static class StringExtensions
{
public static IEnumerable<string> SplitAndKeep(this string s, string seperator)
{
string[] obj = s.Split(new string[] { seperator }, StringSplitOptions.None);
for (int i = 0; i < obj.Length; i++)
{
string result = i == obj.Length - 1 ? obj[i] : obj[i] + seperator;
yield return result;
}
}
}
答案 7 :(得分:1)
逐个字符遍历字符串(这正是正则表达式所做的。 当你找到一个分割器,然后分离一个子串。
伪代码
int hold, counter;
List<String> afterSplit;
string toSplit
for(hold = 0, counter = 0; counter < toSplit.Length; counter++)
{
if(toSplit[counter] = /*split charaters*/)
{
afterSplit.Add(toSplit.Substring(hold, counter));
hold = counter;
}
}
那是C#但不是真的。显然,选择合适的函数名称。 此外,我认为那里可能存在一个错误的错误。
但那会做你所要求的。
答案 8 :(得分:0)
Regex.Split看起来可能能够做你想做的事。
答案 9 :(得分:0)
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
string input = @"This;is:a.test";
char sep0 = ';', sep1 = ':', sep2 = '.';
string pattern = string.Format("[{0}{1}{2}]|[^{0}{1}{2}]+", sep0, sep1, sep2);
Regex regex = new Regex(pattern);
MatchCollection matches = regex.Matches(input);
List<string> parts=new List<string>();
foreach (Match match in matches)
{
parts.Add(match.ToString());
}
}
}
}
答案 10 :(得分:-1)
Java代码:
public static class String_Ext
{
public static string[] SplitOnGroups(this string str, string pattern)
{
var matches = Regex.Matches(str, pattern);
var partsList = new List<string>();
for (var i = 0; i < matches.Count; i++)
{
var groups = matches[i].Groups;
for (var j = 0; j < groups.Count; j++)
{
var group = groups[j];
partsList.Add(group.Value);
}
}
return partsList.ToArray();
}
}
var parts = "abcde \tfgh\tikj\r\nlmno".SplitOnGroups(@"\s+|\S+");
for (var i = 0; i < parts.Length; i++)
Print(i + "|" + Translate(parts[i]) + "|");
输出:
0|abcde|
1| \t|
2|fgh|
3|\t|
4|ikj|
5|\r\n|
6|lmno|