>我有一个正在传递的搜索字符串
例如:"a+b",a,b,"C","d+e",a-b,d
我想过滤掉所有用双引号(")括起来的子字符串。在上面的示例中,输出应包含:
"a+b","C","d+e"
有没有办法在不循环的情况下做到这一点?
然后我还需要提取一个没有上述值的字符串以进行进一步处理
例如:a,b,a-b,d
关于如何在对性能影响最小的情况下做到这一点的任何建议?
提前感谢您的所有意见和建议
既然你没有说你想要的输出(你需要保留逗号和额外的空格吗?开头是逗号分隔的吗?让我们假设它不是逗号分隔的,你只是想删除"xyz"的出现:
string strRegex = @"""([^""])+""";
string strTargetString = @" ""a+b"",a, b, ""C"",""d+e"",a-b,d";
string strOutput = Regex.Replace(strTargetString, strRegex, x => "");
将删除所有项目(保留额外的逗号和空格)。
如果您正在尝试在需要每个单独匹配的地方执行某些操作,那么您可能想尝试:
var y = (from Match m in Regex.Matches(strTargetString, strRegex) select m.Value).ToList<string>();
y.ForEach(s => Console.WriteLine(s));
要获取没有引号的项目列表,您可以反转正则表达式模式或在第一个代码示例中使用 replace 方法,然后在逗号上拆分,修剪空格(再次,假设您正在拆分逗号,听起来像您是)
首先,在输出末尾添加一个逗号:
"a+b",a, b, "C","d+e",a-b,d,
然后,使用此正则表达式:
((?<quoted>".+?")|(?<unquoted>.+?)),s*
现在你有 2 个问题。开玩笑!
您必须找到一种不使用循环提取匹配项的方法,但至少通过使用组将它们分为带引号和不带引号的字符串。您可以使用 lamdba 表达式提取数据并联接它,分别用于带引号和不带引号,但它只是在幕后执行循环,并且可能会比简单的 for 循环增加更多的开销。听起来您正在尝试在这里了解性能,因此请花时间并测试每种方法,看看哪种方法可以获得最佳结果。