匹配运营商

时间:2012-03-12 05:27:09

标签: c# regex operator-keyword

我有一个包含大量运算符,变量和英语单词的文本输入。从这个输入我必须单独分离所有运算符。

截至目前,我正在使用正则表达式匹配,因此匹配的运算符数取决于正则表达式。我得到的问题是'=匹配< =','&与&&'匹配。我需要分别匹配=和< =

是否有更好的方法来匹配除正则表达式之外的运算符?

5 个答案:

答案 0 :(得分:2)

就正则表达式而言,你可以让模式首先匹配特殊(复合)的情况,然后通过简单的交替进行全部匹配。在您的简单输入案例中:/<=|&&|=|&/。这不一定很糟糕,你仍然可以把你所有的东西放在那之后:/special1|...specialN|special-chars-catch-all/

这种技术在某些情况下非常有用,在这些情况下,贪婪的表达式只能得到整个内容,例如:if($x==-1),你需要==,而不是==-

答案 1 :(得分:1)

查看RE语言中的扩展变体。

在大多数RE语言/ [&lt;](?![=])/将匹配“&lt;”但不是“&lt; =”而不是“=”,例如。 (?!...)表示“除了后面跟......”。这个术语是否定前瞻声明。这些有时拼写不同,因为它们不如大多数其他地层标准,但它们通常是可用的。它们从不消耗更多的字符,但它们会产生较慢的匹配。

有时也可以使用“以前除外”或否定后瞻声明,但您可能希望避免使用它。读者很少清楚,可以创建较慢的匹配。

答案 2 :(得分:0)

我认为你仍然可以让正则表达式做你想做的事。

如果你想完全抛弃它,请原谅我并忽略我的建议:)

如果您想使用正则表达式来检测只是 =那么您可以使用[^<>=]=[^<>=],这意味着'只有当它不在前面或由&lt;后面时才匹配等于&GT;或另一个=。

您可以使用带有&符号的{1}&来检测一个(且只有一个)&符号。

(注意,您可能需要使用\

来转义其中几个符号

我希望这可能有所帮助。祝你好运。

ķ。

答案 3 :(得分:0)

可能有。但作为替代方案,你可以将你的正则表达式作为(例如):

[><=&|]+

(根据您的规格进行修改 - 不确定是否需要加法,减法,++进行递增等。)

+表示“一个或多个”,因此正则表达式匹配尽可能多的字符,这意味着如果<=在文本中,它将匹配<=而不是< {1}}然后=

然后,只有在你提取完所有匹配后,才将它们全部循环并对它们进行分类。

答案 4 :(得分:0)

如果你进行多次传递,你也可以找到复合运算符,然后在找到简单传递的传递之前用其他字符替换它们。

这通常是一种有用的方法:在处理时慢慢覆盖解释后的字符串,这样当你完成时剩下的就是令牌。 RE处理器通常返回索引范围。因此,您可以轻松返回并使用其他人以后无法匹配的内容覆盖该范围(如控件字符标记,NUL或波形符)。

一个优点是,您可以拥有执行验证通过的调试代码,以检查您是否没有留下任何未解释的内容。

相关问题