正则表达式将表达式列表与异常分开

时间:2014-05-21 00:53:02

标签: java regex

我有一个用连字符分隔的表达式列表(包含符号):

“exp_1-exp_2-exp_3-exp_4 -...........”

我可以使用正则表达式匹配器/([^-]*)-/和java中的标准matcher.find()将表达式提取到

  • exp_1
  • exp_2
  • exp_3
  • exp_4

等等。

但是,我还想要一个应该作为一个整体匹配的异常列表。例如,我希望“a_1-b_2”和“c_3-d_4”不要拆分。

所以,如果表达式是

“exp_0-A_1-B_2-C_3-D_4-exp_5 ...”

匹配者应该给我列表

  • exp_0
  • A_1-B_2
  • c_3-d_4
  • exp_5

我应该如何修改我的正则表达式?或者有更好的选择吗?

编辑:

一个典型的例子: exp可以是\pi_1*b_3\sqrt{b_2/b_4}。我假设没有减号(连字符)。但我想将术语分组为例:

String exception ="\sqrt{3}-\sqrt{2}"

例如,列表可能是

“5A ^ 3- \ SQRT {3} - \ SQRT {2} - \ PI_1 * B_3”

我应该

  • 图5a ^ 3
  • \ SQRT {3} - \ SQRT {2}
  • \ PI_1 * B_3

(这些只是表达式,不涉及数学,我知道我想要得到什么。)

1 个答案:

答案 0 :(得分:1)

好的,这个特殊的解决方案直接来自Match (or replace) a pattern except in situations s1, s2, s3 etc

这是一个简单的正则表达式,我们将用它来分割正确的破折号:

a_\\d-b_\\d|c_\\d-d_\\d|(-)

两个左OR个案例(即|)中的每一个都与您的一个例外情况相匹配。我们将忽略这些匹配。右侧匹配并捕获破折号到组1,我们知道它们是正确的破折号,因为它们与左侧的表达式不匹配。

我们用SplitHere替换好破折号,然后我们分成SplitHere

此程序显示了如何使用正则表达式(请参阅online demo底部的结果)。只需优化异常正则表达式以满足您的确切需求。

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "exp_0-a_1-b_2-c_3-d_4-exp_5";
Pattern regex = Pattern.compile("a_\\d-b_\\d|c_\\d-d_\\d|(-)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
    if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
    else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("SplitHere");
for (String split : splits) System.out.println(split);
} // end main
} // end Program

<强>输出:

exp_0
a_1-b_2
c_3-d_4
exp_5

参考

  1. How to match pattern except in situations s1, s2, s3