我有一个以下格式的字符串:
文件 = " \r\n 6 : size=70 : <Message body> \r\n 4 : size=3 : Test.txt \r\n 17 : size=24 : Test2.txt"
我想写一个正则表达式来去掉所有的空格,然后将字符串拆分成一个字符串数组,如下所示:
stringArray [0] = "6:size=70:<Message body>"
stringArray [1] = "4:size=3:Test.txt"
stringArray [2] = "17:size=24:Test2.txt"
我想这样做:
Regex pattern = new Regex(@"\s", RegexOptions.Compiled);
files = pattern.Replace(files, String.Empty);
string[] scores = files.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
但问题是我的正则表达式甚至会消除&#34; \ r \ n&#34;,所以我无法通过Environment.NewLine将其拆分,所以我该如何实现这种行为呢? / p>
编辑:我忽略了一件事。我希望在分割<Message body>
或任何其他拆分字符串时保留空格,所以我实际上需要在最后一个冒号的第一个字符之后但在\ r \ n的最后一个字符之前保留空格...例如, <Message body>
或Test 3.txt
应保留空格。
编辑:我想先拆分前使用正则表达式,
答案 0 :(得分:2)
在常规表达中'\'匹配空白字符,包括新行,以避免删除新行替换\ s,用一个空格“”这应该给你所需的行为
Regex pattern = new Regex(@" ", RegexOptions.Compiled);
答案 1 :(得分:2)
这是一种没有正则表达式的方法。
string x = " \r\n 6 : size=70 : <Message body> \r\n 4 : size=3 : Test.txt \r\n 17 : size=24 : Test2.txt";
string[] scores = x.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
.Select(p => p.Trim())
.Where(p => p!=string.Empty).ToArray();
答案 2 :(得分:2)
从您说明的输入/输出,它看起来我真正想要做的是拆分每个\ r \ n,然后有选择地替换空格。
如果您需要进行regex-&gt;拆分,那么这是一个可行的解决方案(给定非常有限的输入)。
static void Main(string[] args)
{
var s = " \r\n 6 : size=70 : <Message body> \r\n 4 : size=3 : Test.txt \r\n 17 : size=24 : Test2.txt";
var pattern = "\n.*";
var match = Regex.Match(s, pattern);
while (match.Success)
{
Console.WriteLine(match.Value.Trim().Replace(" : ", ":"));
match = match.NextMatch();
}
Console.ReadKey();
}
或者,这是一个单行解决方案,虽然可读性要低得多,IMO:
static void Main(string[] args)
{
var s = " \r\n 6 : size=70 : <Message body> \r\n 4 : size=3 : Test.txt \r\n 17 : size=24 : Test2.txt";
var pattern = "\n.*";
Regex.Matches(s, pattern).Cast<Match>().Select(match => match.Value.Trim().Replace(" : ", ":")).ToList().ForEach(Console.WriteLine);
Console.ReadKey();
}
答案 3 :(得分:1)
var s = " \r\n 6 : size=70 : <Message body> \r\n 4 : size=3 : Test.txt \r\n 17 : size=24 : Test 2.txt";
var split = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var results = split.Select(x =>
{
var lastColonIndex = x.LastIndexOf(":");
int nonWhiteSpaceIndex = lastColonIndex + 1;
for(; nonWhiteSpaceIndex < x.Length; ++nonWhiteSpaceIndex)
{
if(!char.IsWhiteSpace(x[nonWhiteSpaceIndex]))
{
nonWhiteSpaceIndex.Dump();
break;
}
}
return (x.Substring(0, nonWhiteSpaceIndex).Replace(" ", "") + x.Substring(nonWhiteSpaceIndex)).Trim();
}).Where(x => !string.IsNullOrWhiteSpace(x)).Dump();