【问题标题】:Pattern Matching - Regex in Java模式匹配 - Java 中的正则表达式
【发布时间】:2023-03-26 06:47:01
【问题描述】:

我正在寻找正则表达式模式提取来提取以下示例,

sample Input: 
"USER 1-EFA-Thermal Analysis-0.25;USER 2-EFA-Thermal Analysis-0.25;"

 String[] parts = filename.split("\\;");
    for (int i=0;i<=parts.length;i++){

    }

上面的代码用“;”将行分成多个部分作为分隔符。 在 For 循环中,我想再次将每个部分 [] 拆分为三个短语,由“-”(破折号)标识。但问题是破折号也可以出现在要分隔的字段中。

所以我的逻辑是将“-”第一次出现之前的单词拆分为第一部分。

第一次出现“破折号”直到最后一次出现“破折号”为第二次的字符串 剩下的是第三部分

例如:

part[0]
USER 1
EFA-Thermal Analysis
0.25

part[1]
USER 2
EFA-Thermal Analysis
0.25

【问题讨论】:

  • "USER 1" 是一个组合词(出现在第一次出现“-”之前的任何内容都被视为字符串的第一部分
  • But problem being the Dash can also appear within the field to be separated. 如果您可以假设恰好有 3 个字段,那么它是可以解决的。
  • 每个短语中总是三个“部分”
  • 那么,每个短语中都有这种模式吗?
  • 是的,它永远是相同的模式

标签: java regex


【解决方案1】:

.split(string regex) 方法很可能不起作用,至少我看不出如何使用它来实现相对简单的解决方案。在我看来,问题在于破折号可能出现在不同的字符类型之间,这使得难以锁定。

我设法通过稍微不同的正则表达式用法来实现您所追求的:

String str = "USER 1-EFA-Thermal Analysis-0.25;USER 2-EFA-Thermal Analysis-0.25;";
Pattern pattern = Pattern.compile("(.+?)-(.+?)-(\\d+(\\.\\d+)?);");
Matcher matcher = pattern.matcher(str);
while(matcher.find())
    System.out.println(matcher.group(1) + " " + matcher.group(2) + " " + matcher.group(3));

下面的代码产生以下信息:

USER 1 EFA-Thermal Analysis 0.25
USER 2 EFA-Thermal Analysis 0.25

根据您提供的示例,应该可以满足您的需求。 here 提供了一个正则表达式示例。

【讨论】:

  • 它非常适合我的情况,也感谢您提供在线网站链接
  • split 可以,但并不简单,依赖于 Java 中的look-behind length check bug:"USER 1-EFA-Thermal Analysis-0.25".split("(?&lt;=^[^-]*)-|-(?=[^-]*$)")
  • @nhahtdh:我试过你的表达,我得到了USER 1EFA-Thermal Analysis-0.25;USER 2-EFA-Thermal Analysis0.25。在我看来,问题是你想要分割的破折号不会有相同的位置,并且取决于 之后发生的事情。我怀疑结果是否可以维护。不过我可能是错的。
  • @npinti: 应该在用;分割初始字符串后使用。
  • @nhahtdh:在这种情况下它可以工作。感谢您提供信息。
【解决方案2】:

使用正则表达式匹配所有内容,直到第一个“减号”:

part.replaceAll("^([^\\-]*)-", "$1\n")

以及从最后一个减号到字符串结尾的所有内容:

part.replaceAll("-([^\\-]*?)$", "\n$1")

代码

String sample = "USER 1-EFA-Thermal Analysis-0.25;USER 2-EFA-Thermal Analysis-0.25;";
String[] parts = sample.split("\\;");

for (String part : parts) {
    part = part.replaceAll("^([^\\-]*)-", "$1\n");
    part = part.replaceAll("-([^\\-]*?)$", "\n$1");
    System.out.println(part);
}

输出

USER 1
EFA-Thermal Analysis
0.25
USER 2
EFA-Thermal Analysis
0.25

Demo on ideone

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多