首页 > 解决方案 > 正则表达式,仅匹配包含一次出现某些字符的字符串

问题描述

我有以下正则表达式:

^[-]?([+]?[\d]+[-+*/]?)+$

我的目标是匹配包含算术表达式和整数的字符串。它是成功的,除了一个案例。说到等号。我只希望这个表达式匹配最多包含一个等号的字符串。这意味着它将匹配

7=7

但不是

7=7=7

因为第二个字符串出现了两次等号。

我尝试使用花括号 {},我想我需要类似的东西

={0,1}

这将与恰好出现一次或未出现“=”的字符串匹配。但不幸的是,我不知道如何将它合并到我的正则表达式中。

标签: regex

解决方案


由于您只想匹配算术表达式和整数,因此我更改了代码以查找具有数字、运算符或等号的所有内容:^[-+*\/\d=]+$。我需要转义角色/->\/

为了只匹配一个等号,我添加了一个负前瞻:(?!.*=.*=). 如果它找到括号内的内容,则整个正则表达式将不匹配。例如,如果您有一个单词 mytext : (?!mytext)整个正则表达式将不匹配。.*意味着它找到了一切(.代表每个字符,并且*说它可以存在 0 到无限次)。

所以这是解决方案:

^(?!.*=.*=)[-+*\/\d=]+$

在此处查看实时示例: https ://regex101.com/r/zhSEmf/1/

此外,您的代码不适用于 -4*-4。

编辑:由于您不希望代码以 / 或 * 开头,因此我在否定前瞻中添加了 id :^(?!.*=.*=|[\/*].*)[-+*\/\d=]+$


推荐阅读