我有一个正在通过的搜索字符串
例如: "a+b",a, b, "C","d+e",ab,d
我想过滤掉所有被双引号(“”)包围的子字符串。在上面的示例输出中应包含:
"a+b","C","d+e"
有没有办法在不循环的情况下做到这一点?
然后我还需要提取一个没有上述值的字符串来做进一步处理
例如:a,b,ab,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));
要获取不带引号的项目列表,您可以反转正则表达式模式或使用第一个代码示例中的替换方法,然后在逗号上拆分,修剪空白(再次,假设您在逗号上拆分听起来像你一样)
首先,在输出末尾添加一个逗号:
"a+b",a, b, "C","d+e",a-b,d,
然后,使用这个正则表达式:
((?<quoted>\".+?\")|(?<unquoted>.+?)),\s*
现在你有两个问题。开玩笑!
您必须找到一种在不使用循环的情况下提取匹配项的方法,但至少通过使用组将它们分成带引号和不带引号的字符串。您可以使用 lamdba 表达式将数据拉出并加入它,每个用于引用和未引用,但它只是在幕后进行循环,并且可能比简单的 for 循环增加更多开销。听起来您正试图在这里寻找性能,因此请花时间测试每种方法,看看什么能提供最佳结果。