我有一个复杂的字符串,里面有很多垃圾但其结构基本上是
"\"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\"\"--test\" \"--test\" \"--test\" \"--test\" \"--test\" \"test\" \"--test\" \"--test\" \" test \"";
我想将\"
之间的所有字符串拆分为27个元素的数组。当我使用我的正则表达式String[] waddup = Regex.Split(test, "\"\\s+\"");
时,它几乎可以使用它,但会留下尾随\"
。
分割后的预期数组:
string [] expectedResult = new string [3] {" test"," - test"," test"," - test& #34;," test"," - test"," test"," - test"," test&# 34;," - test"," test"," - test"," test" " - test"," test"," - test"," test"," - test" ,"测试"};
任何想法如何干净利落?
答案 0 :(得分:2)
如果您更喜欢使用正则表达式匹配双引号内的字符串,您可以考虑:
string line = "\"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\"\"--test\" \"--test\" \"--test\" \"--test\" \"--test\" \"test\" \"--test\" \"--test\" \" test \"";
// or splts = Regex.Matches(line, "(?:^|\\s)\"([^\"]*)\"")
string[] splts = Regex.Matches(line, "\"([^\"]+)\"")
.Cast<Match>()
.Select(p=>p.Groups[1].Value)
.ToArray();
这样,使用.ToArray()
,splts
将是string[]
类型的变量。请参阅IDEONE demo。
我可以建议2个正则表达式,最短的是\"([^\"]+)\"
:
\"
- 匹配前导"
([^\"]+)
- 匹配并捕获"
\"
- 匹配尾随"
答案 1 :(得分:1)
尝试使用 string.Split 使用 StringSplitOptions 删除空条目(如果您的目的是获取所有 test 字符串):< / p>
var waddup = test.Split(new[] { "\\\"" }, StringSplitOptions.RemoveEmptyEntries);
使用完整的控制台示例:
using System;
using System.IO;
using System.Linq;
public class Test
{
public static void Main()
{
var line = "\"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"--test\" \"test\" \"--test\" \"test\" \"--test\" \"test\"\"--test\" \"--test\" \"--test\" \"--test\" \"--test\" \"test\" \"--test\" \"--test\" \" test \"";
var splts = line.Split(new[]{"\\\""}, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(string.Join("\n", splts));
}
}