java - 正则表达式分隔带异常的表达式列表

标签 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}。我假设不涉及减号(连字符)。但我想对术语进行分组,例如:

字符串异常 ="\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

引用

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

关于java - 正则表达式分隔带异常的表达式列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772291/

相关文章:

java - Parquet writer : org. apache.parquet.io.ParquetEncodingException:写入空页

匹配不包括文件路径的目录路径的正则表达式

java - 列出 Windows 文件类型

java - Xpages。使用Java

regex - Google BigQuery 可以做不区分大小写的 REGEXP_Match 吗?

regex - Checkstyle:尾随空格正则表达式问题

java - 检查字符串是否是 XML 文档的有效标记/属性名称

java - 正则表达式将名字/姓氏与可选标题相匹配

无线程实现Runnable的Java类

java - 如何从可执行 jar 文件访问 derby 数据库?