[英]How to deal with Java regular expressions?
我正在处理正则表达式,但是我不是它的忠实拥护者,因此我不得不在任务中处理它:(
我已经花了数小时寻找解决方案,但是每次我无法涵盖所有情况时。 我必须编写一个支持以下模式的正则表达式模板:
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]*)\\\\..*\\\\..* $
请帮忙。 我将不胜感激。
样本中有许多模式可用于设计表达式。 例如,我们可以从以下表达式开始:
^[^-]+-[^-]+-[^_]+_([0-9]+\.){3}[0-9]+$
如果您想探索/简化/修改该表达式,请在此演示的右上面板中进行说明,如果愿意,可以在此链接中逐步查看该表达式与某些示例输入的匹配情况。
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));
}
}
jex.im可视化正则表达式:
试试这个:
^\w+-\w+-(\d+)(\.\d+)+_(\d+\.)+\d+
在Java中,最可能是这样的:
"^\\w+-\\w+-(\\d+)(\\.\\d+)+_(\\d+\\.)+\d+"
说明:
^\\w+-\\w+-
前两个部分,例如DYYU-tx-
(\\d+)(\\.\\d+)+_
数字,以分隔.
以_
结尾,例如6.7.9.7_
(\\d+\\.)+\\d+
数字与分隔.
,例如60.11.11.09
您的模式不匹配,因为您使用的.*
会首先匹配,直到字符串末尾。 然后,您匹配一个_
,使其回溯到最后一个下划线,并尝试匹配该模式的其余部分。
由于有1个下划线,因此您想匹配其后的连字符,但是下划线后没有要匹配的连字符,因此没有匹配项。
编写它的另一种方法可能是使用不匹配连字符的否定字符类 [^-]
而不是使用.*
^[^-]+-[^-]+-\d+(?:\.\d+){3}_\d+(?:\.\d+){3} $
说明
^
字符串开头 [^-]+-
匹配除+以外的任意字符1+次-
[^-]+-
同上 \\d+(?:\\.\\d+){3}
数学1个以上的数字,与a匹配重复3次.
和1个以上的数字 _
匹配下划线 \\d+(?:\\.\\d+){3}
数学1个以上的数字,与a匹配重复3次.
和1个以上的数字 [ ]$
匹配一个空格(为了清楚起见,在括号之间表示)并断言字符串的结尾 在Java中
String regex = "^[^-]+-[^-]+-\\d+(?:\\.\\d+){3}_\\d+(?:\\.\\d+){3} $";
请注意,在示例数据中,字符串以空格结尾,因此$
之前有一个空格
DYYU-tx-(?>\d+[._]?){8}
.
或_
8次。 我假设它将始终以DYYU-tx-开头,并且始终是4个数字,并用句点分隔,然后再加上下划线,然后再有4个数字以句点分隔。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.