c#Regex-用多个分隔符分割字符串但不在引号

时间:2017-09-18 06:13:26

标签: c# regex string

我正在尝试解析c#中的表达式。 表达式可以包含变量表中的变量,因此我需要用它的值替换每个变量名。为了做到这一点,我使用:

拆分字符串
string[] split = Regex.Split(expression, @"([ !<>\b==\b+-/*])");

但是,当字符串包含字符串文字时,这会变得很糟糕。例如:

"\"number-\" + num "(来自Console.print("number-" + num)

应拆分为{"\"number-\"", "num"}, 而不是目前的做法:{"\"number", "-\"", "num"}

我找到了使用单个分隔符char将所有内容拆分为引号的方法,但我尝试用分隔符列表替换分隔符,但它没有用。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我花了一些时间来解决你的问题,但我想我有一个解决方案。 我建议使用两个匹配选项,一个具有正向后观,一个具有正向前瞻。我已经改编了一些@ Wiktor的运营商匹配,但剥夺了罕见的。

(?<=\"[ ]+)(-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])|(-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])(?=[ ]+\")

以下是逐字字符串:@"(?<=\""[ ]+)(-|&&|\+\+|[&*%/|^!=+<>-]?=|[| +&<>%!~^/.*-])|(-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])(?=[ ]+\"")";

这是可测试的sample。 (这并不完美,因为regex101不允许量词在前瞻/后面 - 请阅读下文。)

你只向我们展示了一个例子,所以我做了更多。对于复杂场景,此解决方案将循环漏洞。但他应该回答OP。正则表达式可以成功分割这样的样本:

"number-" + num  
"number-" += num  
"-free-" == bear  
boom += "*freezer*"  
great + "stuff"  
boom + "-freezer-" + "wild"  

运营商也包括在内。你可能想保留它们。如果您不希望我们这样做:

@"(?<=\""[ ]+)(?:-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])|(?:-|&&|\+\+|[&*%/|^!=+<>-] ?=|[|+&<>%!~^/.*-])(?=[ ]+\"")";

这里有一个重要的事情是,lookahead/behind assertions在大多数正则表达式引擎中都不能正常工作。看,只有一个单一的空间。如果您需要更多,.NET框架RegEx类允许您。

小心。