正则判断等式合法性

pubaolin 2010-01-05 09:51:34
如题,等式中有()+-/*^这7个符号,哪位大虾帮我写个正则判断一个等式是否合法.
...全文
278 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pubaolin 的回复:]
引用 5 楼 panhaichun 的回复:
^(((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))[+-\\*/])*((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))$

一层括号时可以,但多层时就不行了
[/Quote]

Java 中的正则表达式不支持嵌套结构!
  • 打赏
  • 举报
回复
正则表达式是用于做字符串匹配、替换、查找的,请不要把正则表达式当作语法分析工具!
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 panhaichun 的回复:]
^(((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))[+-\\*/])*((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))$
[/Quote]
一层括号时可以,但多层时就不行了
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hejinxu 的回复:]
有点难

主要验证就是两个符号不能在一起,但是“(”和“)”就有点不好验证
[/Quote]
指运算会用括号括起来
例:
5*(2^3)
Josh 2010-01-05
  • 打赏
  • 举报
回复
有点难

主要验证就是两个符号不能在一起,但是“(”和“)”就有点不好验证
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 panhaichun 的回复:]
没加指数运算,只有+-*/
[/Quote]
帮我加上指运算吧,谢谢!
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 panhaichun 的回复:]
^(((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))[+-\\*/])*((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))$
[/Quote]
你们没有理解我的意思,5+5*4+(2^2)只是我举的例子,我想判断的是一个字符串是不是合法的等式
真哥哥 2010-01-05
  • 打赏
  • 举报
回复
有楼上的不敢献丑啊!
panhaichun 2010-01-05
  • 打赏
  • 举报
回复
没加指数运算,只有+-*/
阿_布 2010-01-05
  • 打赏
  • 举报
回复

String math = "5+5*4+(2^2)";
String reg = "^(\\d+[\\+\\-\\*/\\^]|\\d+[\\+\\-\\*/\\^]\\(|\\d+\\)[\\+\\*\\-/\\^])+(\\d+\\)|\\d+)$";
System.out.println(math.matches(reg));
panhaichun 2010-01-05
  • 打赏
  • 举报
回复
没考虑到空格
panhaichun 2010-01-05
  • 打赏
  • 举报
回复
^(((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))[+-\\*/])*((((\d+[+-\\*/])*\d+)|(\((\d+[+-\\*/])*\d+)\)))$
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
帮帮我吧
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
5+5*4+(2^2)就是合法的
5+-5就是不合法的
阿_布 2010-01-05
  • 打赏
  • 举报
回复
说具体一点。
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
怎么没人鸟我
天上的星星 2010-01-05
  • 打赏
  • 举报
回复
引用 17 楼 zhigangxie 的回复:
这不是正则语言,不能表达成正则表达式。

即使使用反向引用,正则表达式也是办不到的。因为包含有任意层括号嵌套的语言不是正则语言,不能被DFA(确定有限状态自动机)识别。而正则表达式是一种“正则语言”,而某种语言是一个“正则语言”的一个必要条件是“能够被DFA识别”。而括号嵌套语法需要不确定的存储空间来存放识别过程中的状态,这超出了DFA的能力范围。从理论上讲,没有任何人有这个能力写出这样的正则表达式。

这种表达式文法上属于上下文无关文法,可以使用LR/LL语法分析器进行分析。javacc 是一种广泛使用的 java 语言实现的 LL 分析工具。可以使用 javacc 来分析。

如果只是简单地表达有限的语法,用不着使用 javacc 。只要借用堆栈,就可以很快地写出一个自己需要的语法解析器。


哦,学习了
张祥龙 2010-01-05
  • 打赏
  • 举报
回复
try{
i= 表达式
}catch{
表达式不合法!
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zhigangxie 的回复:]
这不是正则语言,不能表达成正则表达式。

即使使用反向引用,正则表达式也是办不到的。因为包含有任意层括号嵌套的语言不是正则语言,不能被DFA(确定有限状态自动机)识别。而正则表达式是一种“正则语言”,而某种语言是一个“正则语言”的一个必要条件是“能够被DFA识别”。而括号嵌套语法需要不确定的存储空间来存放识别过程中的状态,这超出了DFA的能力范围。从理论上讲,没有任何人有这个能力写出这样的正则表达式。

这种表达式文法上属于上下文无关文法,可以使用LR/LL语法分析器进行分析。javacc 是一种广泛使用的 java 语言实现的 LL 分析工具。可以使用 javacc 来分析。

如果只是简单地表达有限的语法,用不着使用 javacc 。只要借用堆栈,就可以很快地写出一个自己需要的语法解析器。
[/Quote]
哦,学习了,看来以后的路还很长
pubaolin 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bao110908 的回复:]
正则表达式是用于做字符串匹配、替换、查找的,请不要把正则表达式当作语法分析工具!
[/Quote]
嗨~ 作用都没整明白就用,真丢人!学习了
加载更多回复(1)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧