我正在尝试解析c#中的表达式。 表达式可以包含变量表中的变量,因此我需要用它的值替换每个变量名。为了做到这一点,我使用:
拆分字符串string[] split = Regex.Split(expression, @"([ !<>\b==\b+-/*])");
但是,当字符串包含字符串文字时,这会变得很糟糕。例如:
"\"number-\" + num "
(来自Console.print("number-" + num)
)
应拆分为{"\"number-\"", "num"}
,
而不是目前的做法:{"\"number", "-\"", "num"}
。
我找到了使用单个分隔符char将所有内容拆分为引号的方法,但我尝试用分隔符列表替换分隔符,但它没有用。
提前致谢。
答案 0 :(得分:0)
我花了一些时间来解决你的问题,但我想我有一个解决方案。 我建议使用两个匹配选项,一个具有正向后观,一个具有正向前瞻。我已经改编了一些@ Wiktor的运营商匹配,但剥夺了罕见的。
(?<=\"[ ]+)(-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])|(-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])(?=[ ]+\")
以下是逐字字符串:@"(?<=\""[ ]+)(-|&&|\+\+|[&*%/|^!=+<>-]?=|[| +&<>%!~^/.*-])|(-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])(?=[ ]+\"")";
这是可测试的sample。 (这并不完美,因为regex101不允许量词在前瞻/后面 - 请阅读下文。)
你只向我们展示了一个例子,所以我做了更多。对于复杂场景,此解决方案将循环漏洞。但他应该回答OP。正则表达式可以成功分割这样的样本:
"number-" + num
"number-" += num
"-free-" == bear
boom += "*freezer*"
great + "stuff"
boom + "-freezer-" + "wild"
运营商也包括在内。你可能想保留它们。如果您不希望我们这样做:
@"(?<=\""[ ]+)(?:-|&&|\+\+|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])|(?:-|&&|\+\+|[&*%/|^!=+<>-] ?=|[|+&<>%!~^/.*-])(?=[ ]+\"")";
这里有一个重要的事情是,lookahead/behind assertions在大多数正则表达式引擎中都不能正常工作。看,只有一个单一的空间。如果您需要更多,.NET框架RegEx类允许您。
小心。