C#REGEX-由多个定界符分开字符串,而不是内部引号



我试图在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类允许您。

注意。

最新更新