我有一个传递的搜索字符串
例如:“a + b”,a,b,“C”,“d + e”,a-b,d
我想过滤掉双引号(“”)包围的所有子字符串。 在上面的示例中,输出应包含:
“A + B”, “C”, “d + e” 的
有没有办法在没有循环的情况下执行此操作?
此外,我还需要提取一个没有上述值的字符串来进行进一步处理
例如:a,b,a-b,d
有关如何以最小的性能影响执行此操作的任何建议?
提前感谢您提出的所有意见和建议
答案 0 :(得分:0)
因为你没有说出你想要输出的确切内容(你需要保留逗号和额外的空格吗?是否以逗号分隔开头?让我们假设它不是逗号分隔而你只是在尝试删除“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方法然后在逗号上拆分,修剪空格(再次假设您在逗号上拆分)它听起来像你)
答案 1 :(得分:0)
首先,在输出结尾添加一个逗号:
"a+b",a, b, "C","d+e",a-b,d,
然后,使用这个正则表达式:
((?<quoted>\".+?\")|(?<unquoted>.+?)),\s*
现在你有2个问题。开玩笑!的
你必须找到一种不使用循环来提取匹配的方法,但至少使用该组将它们分成带引号和不带引号的字符串。您可以使用lamdba表达式将数据拉出并加入,每个表达引用和不引用,但它只是在幕后进行循环,并且可能比简单的for循环增加更多开销。这听起来像是你试图在这里找到性能,所以时间和测试每种方法,看看什么给出了最好的结果。