我有一个用连字符分隔的表达式列表(包含符号):
“exp_1-exp_2-exp_3-exp_4 -...........”
我可以使用正则表达式匹配器/([^-]*)-/
和java中的标准matcher.find()
将表达式提取到
等等。
但是,我还想要一个应该作为一个整体匹配的异常列表。例如,我希望“a_1-b_2”和“c_3-d_4”不要拆分。
所以,如果表达式是
“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”
我应该
(这些只是表达式,不涉及数学,我知道我想要得到什么。)
答案 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
参考