2012-03-12 86 views
2

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

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

有没有更好的方法来匹配除正则表达式之外的其他操作符?

回答

0

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

[><=&|]+ 

(修改您的要求 - 不知道,如果你想加,减,++用于增加等也是如此)。

+的意思是“一个或多个”等正则表达式尽可能多的字符可能的匹配,这意味着如果<=是文本,它将匹配<=而不是<然后=

然后,只有当你已经提取的所有比赛中,遍历所有这些,把它们归类。

+0

thanx。我怎么能错过'+',它解决了我的大部分问题。现在我的问题看起来很愚蠢。 – gout 2012-03-12 05:56:15

+0

现在问题是“c = a +++ b”您的逻辑需要+++作为单个运算符。需要抓住这一点。 – gout 2012-03-12 06:14:13

+0

使用替代方法,先将++作为离散标记,然后在此处使用表达式。 – sweaver2112 2012-03-12 06:26:02

0

我想你可能仍然能够得到正则表达式来做你想做的事情。

如果你想完全放弃它,请原谅我,如果你想使用正则表达式来检测只是 =那么你可以使用[^<>=]=[^<>=]无视我的建议:)

这意味着“只有在符合平等它不会在<>或其他=之前或分开。

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

(NB您可能需要逃避一对夫妇这些符号与\

我希望可以帮助。祝你好运。

K.

+0

对不起,如果我不清楚这个问题。我需要匹配=和<=分离。 as =是赋值运算符,<=是相关的。我需要匹配它们并保持它们的功能。 – gout 2012-03-12 05:46:33

+0

当然,在这种情况下,您可以为每个操作员分别设置一个正则表达式,以查看它是否匹配。一个用于=,一个用于<=等 – 2012-03-12 05:54:59

2

至于正则表达式的话,你可以有图案的特殊(化合物)的情况下先匹配,那么包罗万象的最后一个简单的交替。在您的简单输入案例中:/<=|&&|=|&/。这并不一定是可怕的,你仍然可以把任何你包罗万象的是之后:/special1|...specialN|special-chars-catch-all/

其中一个贪婪的表情只会让整个事情,这样的技术可以在某些情况下非常有用:if($x==-1),你会想==,不==-

+0

抱歉,我没有正确地给你。你说我们可以使用正则表达式,比如“/ <= | && | ++ | - |&+ - <> = /”。 – gout 2012-03-12 09:01:56

+0

嗯,是的。 '|'的意思是“或”。并记住要转义特殊字符(如+)。例如,'/ [<> =] = | && | \ + \ + | - | [&+ <> = - ] /'(和除法,乘法,模数,||等)。在较短的运营商之前运营商时间更长,并且逃避特殊字符 – 2012-03-12 09:47:56

+0

好的。得到它,并删除该帖子,因为你在这里回答.. – gout 2012-03-12 10:01:35

1

看看你RE语言的扩展型。例如,(?![=])/将与“<”匹配,但不是“< =”,而不是“=”。在(?!...)表示 “后面时除外......”。这个术语是负超前进断言。这些拼写有时拼写不同,因为它们不如大多数其他编队标准,但通常可用。他们从不消费更多的角色,但他们创造了较慢的匹配。

的“除非前面有”或负向后看断言有时也可以,但你可能希望避免它。读者很少清楚,可以创建较慢的匹配。

0

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

无论如何,这通常是一种非常有用的方法:在处理时缓慢地覆盖解释的字符串,以便在完成后留下的内容只是令牌。 RE处理器通常返回索引范围。因此,您可以轻松地返回并使用其他人以后不会匹配的内容覆盖该范围(如控制字符标记,NUL或代字号)。

一个好处是,您可以通过调试代码进行验证,以检查是否没有任何未解释的东西。

+3

欢迎来到SO!没有必要回答两次。只需编辑一个答案(答案下方的小编辑链接)即可扩展它。总是试着判断它是否值得另一个答案(更好地说:针对同一问题的解决方案采用不同的(!)方法)。对我来说,这个答案似乎更有可能扩展你的其他答案。 – 2014-01-13 17:33:11