求个正则表达式,Java能用的

2025-01-02 05:39:17
推荐回答(5个)
回答1:

若是仅实现你列出的需求可以给你个式子:

JAVA:

Pattern  reg = Pattern.compile("\\(?((\\d+[+-*/])*\\((\\d+[+-*/])+\\d\\)?([+-*/]\\d+)*)\\)");

如果你还想嵌套你用C#平衡组吧,或者根本不建议用正则实现。

标准正则实现这个是非常吃力的。

回答2:

兄弟,你这个要求采用标准正则表达式已经不能解决了,我估计你还想匹配到(1+5*(4-2/(7-4*(9-7)))-2)+7asdfe8中的(1+5*(4-2/(7-4*(9-7)))-2)吧。因为这里边有模式的嵌套与递归,需要用到平衡组的概念,而目前,标准Java库的正则表达式根本不支持这种特性。也许Apache的正则表达式库支持,但我没有那么多时间去验证,你可以搜索“正则表达式,平衡组"等去寻求答案,先在终端用perl来测试(perl是支持平衡组的),最后再转到Java里边,使用Apache的正则表达式库来验证。之所以这样,是因为java里边字符写起来太麻烦,尤其在写正则时,一大堆的反斜杠。这个需要花不少时间的。相信你自己就能搞定了。

回答3:

import java.util.regex.*;

public class ReggaeTest {
public static void main(String[] args) {
String[] strings = {
"(1+2)+(3sada4)",
"(1+2+3)+4",
"((1+2)+3)+4",
"(1+(2+3))+4",
"((1-(2*3)+((1-2)/1)*3)+4" };
String regex = "\\x28[123+\\-\\*/()]{3,}\\x29";
Pattern p = Pattern.compile(regex);
Matcher m = null;
for (String s : strings) {
m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
}
}
}
/*
打印结果
(1+2)
(1+2+3)
((1+2)+3)
(1+(2+3))
((1-(2*3)+((1-2)/1)*3)
*/

回答4:

你的计算方式也不能固定,按照我想的你还不如匹配 (1+2)+(3sada4) 中的 +(3sada4) ,去掉这些匹配出来的没有计算公式的字符串。剩下的不就是你要得公式了。

回答5:

(((?\()[^a-z])+|(?<-k>\)))*?