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



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

例如:"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 循环增加更多的开销。听起来您正在尝试在这里了解性能,因此请花时间并测试每种方法,看看哪种方法可以获得最佳结果。

最新更新