我有一个由连字符分隔的表达式(包含符号)列表:
“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}
。我假设不涉及减号(连字符)。但我想对术语进行分组,例如:
字符串异常 ="\sqrt{3}-\sqrt{2}"
例如,列表可能是
“5a^3-\sqrt{3}-\sqrt{2}-\pi_1*b_3”
我应该得到
- 5a^3
- \sqrt{3}-\sqrt{2}
- \pi_1*b_3
(这些只是表达式,不涉及数学,我知道我想要得到什么。)
最佳答案
好吧,这个特定的解决方案直接来自 Match (or replace) a pattern except in situations s1, s2, s3 etc
这是一个简单的正则表达式,我们将使用它来分割正确的破折号:
a_\\d-b_\\d|c_\\d-d_\\d|(-)
左侧的两个 OR
情况(即 |
)均与您的一个异常(exception)情况匹配。我们将忽略这些匹配。右侧匹配并捕获第 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
引用
关于java - 正则表达式分隔带异常的表达式列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772291/