Java 正则表达式-不允许某些字符连续出现
我不确定这是否可行: 编写将中缀符号转换为后缀符号的程序。到目前为止,一切都进展顺利,但要实现验证却很困难 我尝试使用正则表达式验证中缀符号,符合以下规则:Java 正则表达式-不允许某些字符连续出现,java,regex,Java,Regex,我不确定这是否可行: 编写将中缀符号转换为后缀符号的程序。到目前为止,一切都进展顺利,但要实现验证却很困难 我尝试使用正则表达式验证中缀符号,符合以下规则: 字符串必须仅以数字或((程序不允许负数)开头 字符串只能以数字结尾或) 字符串只能包含0-9*/()-+ 字符串不能允许以下字符同时出现+*/- 我有一个符合前3条规则的正则表达式: (^[0-9(])([0-9+()*]+)([0-9)]+$) 可以使用正则表达式实现最后一条规则吗?我只回答第四条规则,因为您只对它有问题 是的,这是有可
(
(程序不允许负数)开头)
0-9*/()-+
+*/-
(^[0-9(])([0-9+()*]+)([0-9)]+$)
可以使用正则表达式实现最后一条规则吗?我只回答第四条规则,因为您只对它有问题 是的,这是有可能的,但我认为正则表达式不是检查 此模式将匹配任何包含
+
且不包含其他字符的字符串:/
,*
,*
,-
。因为一个字符已经很长很难读了
它使用条件表达式(?…)
检查+
的前瞻性检查是否成功,如果成功,则负前瞻性确保没有任何\*-
字符
对于所有字符,正则表达式将变得非常大,并且很难维护
这就是为什么我不建议将其用于此任务。我同意MichałTurczyn的观点,即正则表达式不是此任务的任务,但没有理由。实施您的限制很容易。但是,您的限制也允许使用诸如
(0+3
、2(*4)
、(((1
)和其他您可能不想要的东西之类的表达式,因此正则表达式验证是毫无意义的。如果您是使用具有某些重要功能的正则表达式引擎编写的,如PCRE(Perl、PHP)或Onigo(Ruby),您可以在regex中伪造解析器;但在Java中,regex的功能非常有限。尽管如此,它足以满足问题中的要求:
^[0-9(](?:(?![+*/-][+*/-])[0-9+*/()-])*[0-9)]$
- 以数字或括号开头
- 任何允许字符的任意重复次数,使得该字符和下一个字符不同时是运算符
- 以数字或论文结尾