正则表达式-禁止某些字符连续出现

时间:2018-09-21 11:24:13

标签: java regex

我不确定这是否可行

编写一个将中缀符号转换为后缀符号的程序。到目前为止,一切工作都很好,但是尝试实施验证却很困难。

我正在尝试使用正则表达式来验证中缀表示法,并遵守以下规则:

  1. 字符串只能以数字或(开头(程序不允许使用负数)
  2. 字符串只能以数字或)
  3. 结尾
  4. 字符串只能包含0-9*/()-+
  5. 字符串必须不允许以下字符一起出现+*/-

我有一个符合前三个规则的正则表达式:

(^[0-9(])([0-9+()*]+)([0-9)]+$)

是否可以使用正则表达式实现最后一条规则?

2 个答案:

答案 0 :(得分:1)

我只会回答第四条规则,因为您仅对此有疑问。

是的,有可能,但是我认为regex不是检查...的合适工具。

此模式^(?(?=.*\+)(?!.*[\*\/-])).+$将匹配包含+且不包含其他字符的任何字符串:/*-。因为一个字符已经很长,很难阅读。 See demo

它使用条件表达式(?...)来检查+的前瞻检查是否成功,如果成功,则否定的前瞻性确保您不会有\*-个字符。< / p>

对于所有字符,正则表达式将变得很大且难以维护。

这就是为什么我不推荐此任务的原因。

答案 1 :(得分:0)

我同意MichałTurczyn的观点,正则表达式不是此任务,但并非出于原因。实施您的限制很容易。但是,您的限制还允许使用(0+32(*4)((((1之类的表达式以及您可能不希望使用的其他内容-因此正则表达式验证毫无意义。如果您使用具有强大功能的正则表达式引擎(例如PCRE(Perl,PHP)或Onigmo(Ruby))编写此代码,则可以在正则表达式中伪造一个解析器。但是在Java中,正则表达式的功能受到很大限制。但是,对于问题中的要求就足够了:

^[0-9(](?:(?![+*/-][+*/-])[0-9+*/()-])*[0-9)]$
  • 以数字或括号开头
  • 任何允许的字符的任意数量的重复,以使该字符和下一个字符都不都是运算符
  • 以数字或论文结尾。