繁体   English   中英

正则表达式,仅匹配包含一次出现某些字符的字符串

[英]Regex, only match with strings that contain one occurence of certain characters

我有以下正则表达式:

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

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

7=7

但不是

7=7=7

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

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

={0,1}

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

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

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

所以这是解决方案:

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

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

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

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

如果你想匹配只有一个等号的字符串,那么你不想匹配没有等号的字符串,也不想匹配多个等号的字符串。 像这样的正则表达式:

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

不幸的是,这将匹配像9=这样的字符串。 可能是不希望的。

我怀疑你想同时匹配 a=b 形式的字符串和 a 形式的字符串,其中 a 和 b 是数字。 然后这将起作用:

^[-+*\/\d]+(=[-+*\/\d]+){0,1}$

不幸的是,这将匹配*9=+8之类的字符串,但修复此问题会使正则表达式更加复杂,因此不太适合作为示例。 例如,对于没有等号的表达式: Regular Expression for Simple Arithmetic String

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM