0

我有一个正在通过的搜索字符串

例如: "a+b",a, b, "C","d+e",ab,d

我想过滤掉所有被双引号(“”)包围的子字符串。在上面的示例输出中应包含:

"a+b","C","d+e"

有没有办法在不循环的情况下做到这一点?

然后我还需要提取一个没有上述值的字符串来做进一步处理

例如:a,b,ab,d

关于如何以最小的性能影响做到这一点的任何建议?

预先感谢您的所有意见和建议

4

2 回答 2

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));

要获取不带引号的项目列表,您可以反转正则表达式模式或使用第一个代码示例中的替换方法,然后在逗号上拆分,修剪空白(再次,假设您在逗号上拆分听起来像你一样)

于 2012-12-11T03:04:32.467 回答
0

首先,在输出末尾添加一个逗号:

"a+b",a, b, "C","d+e",a-b,d,

然后,使用这个正则表达式:

((?<quoted>\".+?\")|(?<unquoted>.+?)),\s*

现在你有两个问题。开玩笑!

您必须找到一种在不使用循环的情况下提取匹配项的方法,但至少通过使用组将它们分成带引号和不带引号的字符串。您可以使用 lamdba 表达式将数据拉出并加入它,每个用于引用和未引用,但它只是在幕后进行循环,并且可能比简单的 for 循环增加更多开销。听起来您正试图在这里寻找性能,因此请花时间测试每种方法,看看什么能提供最佳结果。

于 2012-12-11T05:53:54.820 回答