Java-Regex为运算符拆分数学表达式,不包括括号中的运算符
我需要使用下面的正则表达式拆分下面的字符串。但它会分割括号内的数据Java-Regex为运算符拆分数学表达式,不包括括号中的运算符,java,regex,Java,Regex,我需要使用下面的正则表达式拆分下面的字符串。但它会分割括号内的数据 Input T(i-1).XX_1 + XY_8 + T(i-1).YY_2 * ZY_14 Expected Output T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14 它不应该分割属于和的数据 我尝试了下面的代码,但是分割了和下面的数据 String[] result = expr.split("[+*/]"); 任何指向修复此问题的指针 我不熟悉这个正则表达式 Input (T(i
Input
T(i-1).XX_1 + XY_8 + T(i-1).YY_2 * ZY_14
Expected Output
T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14
它不应该分割属于和的数据
我尝试了下面的代码,但是分割了和下面的数据
String[] result = expr.split("[+*/]");
任何指向修复此问题的指针
我不熟悉这个正则表达式
Input
(T(i-1).XX_1 + XY_8) + T(i-1).YY_2 * (ZY_14 + ZY_14)
Output
T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14 , ZY_14
如果是Ti-1,则需要忽略
对于下面的表达式,它不起作用
XY_98 + XY_99 +XY_100
String lineExprVal = lineExpr.replaceAll("\\s+","");
String[] result = lineExprVal.split("[+*/-] (?!(^))");
您可以像这样拆分括号外的所有内容:
String str = "T(i-1).XX_1 + XY_8 + T(i-1).YY_2 * ZY_14";
String result[] = str.split("[+*/-] (?!(^))");
//---------------------------^----^^--List of your delimiters
System.out.println(Arrays.toString(result));
这将打印:
[T(i-1).XX_1 , XY_8 , T(i-1).YY_2 , ZY_14]
这个想法很简单,您必须使用不在括号内的分隔符进行拆分
你可以在这里检查,也可以在这里检查正则表达式
编辑
在第二种情况下,必须使用此正则表达式:
String str = "(T(i - 1).XX_1 + XY_8)+ (i - 1).YY_2*(ZY_14 + ZY_14)";
String result[] = str.split("[+*+\\/-](?![^()]*(?:\\([^()]*\\))?\\))");
System.out.println(Arrays.toString(result));
(\w+\([\w-*+\/]+\).\w+)|((?:(\w+\(.*?\))))|(\w+)
这将为您提供:
[(T(i-1).XX_1+XY_8), T(i-1).YY_2, (ZY_14+ZY_14)]
^----Group1------^ ^--Groupe2-^ ^--Groupe3-^
你可以在这里找到,我从这篇文章中启发了这个解决方案
希望这能帮助你 在第二个数学表达式中拆分非常困难,如果不可能的话,因此您必须使用pattern,它更有用,因此对于您的表达式,您需要以下正则表达式:
String str = "(T(i - 1).XX_1 + XY_8)+ (i - 1).YY_2*(ZY_14 + ZY_14)";
String result[] = str.split("[+*+\\/-](?![^()]*(?:\\([^()]*\\))?\\))");
System.out.println(Arrays.toString(result));
(\w+\([\w-*+\/]+\).\w+)|((?:(\w+\(.*?\))))|(\w+)
这是一个你会更了解的例子
要获得结果,需要循环抛出结果:
public static void main(String[] args) {
String input = "(T(i-1).XX_1 + XY_8) + X + T(i-1).YY_2 * (ZY_14 + ZY_14) + T(i-1)";
Pattern pattern = Pattern.compile("(\\w+\\([\\w-*+\\/]+\\).\\w+)|((?:(\\w+\\(.*?\\))))|(\\w+)");
Matcher matcher = pattern.matcher(input);
List<String> reslt = new ArrayList<>();
while (matcher.find()) {//loop throw your matcher
if (matcher.group(1) != null) {
reslt.add(matcher.group(1));
}
//In your case you have to avoid this two groups
// if (matcher.group(2) != null) {
// reslt.add(matcher.group(2));
// }
// if (matcher.group(3) != null) {
// reslt.add(matcher.group(3));
// }
if (matcher.group(4) != null) {
reslt.add(matcher.group(4));
}
}
reslt.forEach(System.out::println);
}
总是只有一级括号吗?@markusthoemes。对只有一级括号可以让括号外的输入包含-符号?事实上,即使是你的简单正则表达式也行。@Raje我已经发布了一个新的答案,就像我保证的那样,希望这能帮助你解释正则表达式。我不能理解它的第二部分,但即使是这个[+*/]正则表达式也会打印相同的输出。重点是什么,我不明白。如果括号外有-符号,这个正则表达式将不起作用。YCF_L对于减法,它会给出一些不同的结果Ti-1.XX_1-XY_8+Ti-1.YY_2*ZY_14让我们来看看。