提取用双引号括起来的字符串的正则表达式方法

时间:2012-12-11 02:05:46

标签: c# regex

我有一个传递的搜索字符串

  

例如:“a + b”,a,b,“C”,“d + e”,a-b,d

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

  

“A + B”, “C”, “d + e” 的

有没有办法在没有循环的情况下执行此操作?

此外,我还需要提取一个没有上述值的字符串来进行进一步处理

  

例如:a,b,a-b,d

有关如何以最小的性能影响执行此操作的任何建议?

提前感谢您提出的所有意见和建议

2 个答案:

答案 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循环增加更多开销。这听起来像是你试图在这里找到性能,所以时间和测试每种方法,看看什么给出了最好的结果。