匹配运算符
本文关键字:运算符 | 更新日期: 2023-09-27 18:27:40
我有一个包含大量运算符、变量和英语单词的文本输入。根据这个输入,我必须单独分离所有运算符。
到目前为止,我正在使用正则表达式匹配,因此匹配的运算符数量取决于正则表达式。我遇到的问题是'=与<='匹配,'&与&;'。我需要同时匹配=和<=分别地
除了正则表达式之外,还有什么更好的方法来匹配运算符吗?
就regex而言,您可以先让模式匹配特殊(复合)情况,然后通过简单的交替将catch-all匹配到最后。在您的简单输入案例中:/<=|&&|=|&/
。这并不一定很可怕,你仍然可以把你的捕获物放在那之后:/special1|...specialN|special-chars-catch-all/
在某些情况下,这种技术可能很有用,贪婪表达式只会得到整个东西,比如:if($x==-1)
,你想要的是==
,而不是==-
查看RE语言中的扩展变体。
例如,在大多数RE语言中,/[<](?![=])/将匹配"<",但不匹配"<=",也不匹配"="。(?!…)的意思是"除非后面跟着…"。这个术语是否定前瞻断言。这些队形有时拼写不同,因为它们不像大多数其他队形那样标准,但它们通常是可用的。它们从不消耗更多的字符,但会创建较慢的匹配。
"except when preced"或Negative Look behind Assertion有时也可用,但您可能希望避免使用它。读者很少清楚它,并且可能会创建较慢的匹配。
可能有。但作为替代方案,您可以将正则表达式设置为(例如):
[><=&|]+
(根据您的规范进行修改-不确定您是否也想要加法、减法、用于递增的++
等)。
+
的意思是"一个或多个",因此正则表达式匹配尽可能多的字符,这意味着如果文本中有<=
,它将匹配<=
,而不是<
,然后是=
。
然后,只有在提取了所有匹配项后,才对它们进行循环并进行分类。
我认为您仍然可以使用regex来执行您想要的操作。
如果你想完全放弃它,请原谅我,忽略我的建议:)
如果您想使用regex来检测just=,那么您可以使用[^<>=]=[^<>=]
,意思是"只有在前面或后面没有<>时才匹配等号"或者另一个=。
您可以将{1}&
与"与"符号一起使用来检测一个(并且只能检测一个)"与"。
(注意,你可能需要用'
逃离几个这样的符号)
我希望这会有所帮助。祝你好运
K。
如果进行多次传递,还可以找到复合运算符,然后在找到简单运算符的传递之前用其他字符替换它们。
无论如何,这通常是一种有用的方法:在处理解释的字符串时慢慢覆盖它,这样完成后剩下的只是令牌。RE处理器通常返回索引范围。因此,您可以很容易地返回并用其他人稍后无法匹配的东西(如控制字符标记、NUL或波浪号)覆盖该范围。
一个优点是,您可以让调试代码进行验证,以检查您是否没有留下任何未解释的内容。