我试图在c#中解析表达式。该表达式可以包含来自变量表的变量,因此我需要用其值替换每个变量名称。为了做到这一点,我使用以下方式分裂字符串:
string[] split = Regex.Split(expression, @"([ !<>b==b+-/*])");
但是,当字符串包含字符串文字时,这会变得不好。例如:
""number-" + num "
(来自 Console.print("number-" + num)
)
应分为{""number-"", "num"}
,而不是目前的作用:{""number", "-"", "num"}
。
我找到了用单个定界符字符来将所有内容分开的方法,但是我尝试用我的定界线列表替换定界符,但它不起作用。
预先感谢。
我花了我一段时间来解决您的问题,但我认为我有一个解决方案。我建议使用两种匹配选项,一种具有正面的外观,另一种具有正面的lookahead。我已经改编了一些 @Wiktor的操作员比赛,但剥夺了稀有的匹配项。
(?<="[ ]+)(-|&&|++|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])|(-|&&|++|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])(?=[ ]+")
这是逐字字符串: @"(?<=""[ ]+)(-|&&|++|[&*%/|^!=+<>-]?=|[| +&<>%!~^/.*-])|(-|&&|++|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])(?=[ ]+"")";
这是可测试的样本。(这不是完美的,因为Regex101不允许在lookahead/后面的量词 - 请阅读下面)。
您只向我们展示了一个例子,所以我做了更多。对于复杂的方案,该解决方案将循环孔。但是他应该回答OP。正则可以成功地将样本分开:
"number-" + num
"number-" += num
"-free-" == bear
boom += "*freezer*"
great + "stuff"
boom + "-freezer-" + "wild"
还包括操作员。您可能要保留它们。如果您不希望他们这样做:
@"(?<=""[ ]+)(?:-|&&|++|[&*%/|^!=+<>-]?=|[|+&<>%!~^/.*-])|(?:-|&&|++|[&*%/|^!=+<>-] ?=|[|+&<>%!~^/.*-])(?=[ ]+"")";
这里重要的一件事是,如果您将量词放入量词,则在大多数Regex引擎中的lookahead/背后的断言无法正常工作。看,只有一个空间。如果您想要更多,则.NET Framework Regex类允许您。
注意。