如何处理Java正则表达式?

时间:2019-07-11 15:08:12

标签: java regex

我正在处理正则表达式,但是我不是它的忠实拥护者,因此我不得不在任务中处理它:(

我已经花了数小时寻找解决方案,但是每次我无法涵盖所有​​情况时。 我必须编写一个支持以下模式的正则表达式模板:

 DYYU-tx-6.7.9.7_6.1.1.0 
 DYYU-tx-6.7.9.7_60.11.11.09 
 DYYU-tx-60.70.90.70_6.1.1.0 

我觉得这很简单。如果对某人来说这是一个愚蠢的问题,请原谅:(

我尝试了这种模式,但是没有用: ^.*_.*-.*-([0-9]*)\\..*\\..* $

请任何帮助。 我将不胜感激。

4 个答案:

答案 0 :(得分:6)

示例中有很多模式,例如,我们可以从以下表达式开始:

^[^-]+-[^-]+-[^_]+_([0-9]+\.){3}[0-9]+$

this demo的右上角对表达式进行了说明,如果您想探索/简化/修改它,在this link中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "^[^-]+-[^-]+-[^_]+_([0-9]+\\.){3}[0-9]+$";
final String string = "DYYU-tx-6.7.9.7_6.1.1.0\n"
     + "DYYU-tx-6.7.9.7_60.11.11.09\n"
     + "DYYU-tx-60.70.90.70_6.1.1.0";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:3)

尝试这个:

^\w+-\w+-(\d+)(\.\d+)+_(\d+\.)+\d+

Demo

在Java中最可能是这样的:

"^\\w+-\\w+-(\\d+)(\\.\\d+)+_(\\d+\\.)+\d+"

说明:

  • ^\w+-\w+-前两部分,例如DYYU-tx-
  • (\d+)(\.\d+)+_数字以.分隔,以_结尾,例如6.7.9.7_
  • (\d+\.)+\d+号与.分开,例如60.11.11.09

答案 2 :(得分:3)

您的模式不匹配,因为您使用Row day type count prev_count 1 2019-06-08 a 1 0 2 2019-06-09 a 2 0 3 2019-06-10 a 3 1 4 2019-06-07 b 4 0 5 2019-06-09 b 5 4 ,它将首先匹配直到字符串的末尾。然后,您匹配一个 @HostListener("click", ["$event"]) click(element) { console.log(element.className); this.isOpen = !this.isOpen; } ,以便它回溯到最后一个下划线,并尝试匹配模式的其余部分。

由于下划线为1,因此您想匹配其后的连字符,但下划线后没有匹配的连字符,因此没有匹配项。

另一种写方法可能是使用negated character class .*而不是连字符而不是使用_

[^-]

说明

  • .*字符串的开头
  • ^[^-]+-[^-]+-\d+(?:\.\d+){3}_\d+(?:\.\d+){3} $ 匹配除^以外的其他任何字符1倍以上
  • [^-]+-与上面相同
  • -数学1位以上的数字,重复3次以匹配[^-]+-和1位以上的数字
  • \d+(?:\.\d+){3}匹配下划线
  • .数学1位以上的数字,重复3次以匹配_和1位以上的数字
  • \d+(?:\.\d+){3}匹配一个空格(为清楚起见,在括号之间表示)并断言字符串的结尾

在Java中

.

Regex demo

请注意,在示例数据中,字符串以空格结尾,因此[ ]$之前有一个空格

答案 3 :(得分:2)

DYYU-tx-(?>\d+[._]?){8}
  1. 搜索文字DYYU-tx-
  2. 寻找1个或多个数字,然后跟上._ 8次。

我假设它将始终以DYYU-tx-开头,并且始终是4个数字,并以句点分隔,然后再加上一个下划线,然后再有4个数字,以句点分隔。