Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写正则表达式模式以便于理解/维护?_Java_Regex - Fatal编程技术网

Java 编写正则表达式模式以便于理解/维护?

Java 编写正则表达式模式以便于理解/维护?,java,regex,Java,Regex,如下所示的正则表达式模式: ".*/.*/.*/.*/.*/.*/(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*" 真的很难维持 我想知道,是否有以下情况: ".*<userName>/.*<envName>/.*<serviceName>/.*<dataType>/.*<date>/.*<host>/(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*<fileName>" “

如下所示的正则表达式模式:

".*/.*/.*/.*/.*/.*/(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*"
真的很难维持

我想知道,是否有以下情况:

".*<userName>/.*<envName>/.*<serviceName>/.*<dataType>/.*<date>/.*<host>/(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*<fileName>"
“*/.*/.*/.*/.*/.*/././(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*”
帮助更容易地阅读/理解正则表达式

更新日期:2018-12-07 感谢@Liinux的帮助,我们调用了它,一个简单的java演示是:

public static void main(String[] args) {
    String re = "(?x)"
            + "# (?x) is the free-spacing flag\n"
            + "#anything here between the first and last will be ignored\n"
            + "#in free-spacing mode, whitespace between regular expression tokens is ignored\n"
            + "(19|20\\d\\d)       # year (group 1)\n"
            + "[-/\\.]             # separator\n"
            + "(\\d{2})            # month (group 2)\n"
            + "[-/\\.]             # separator\n"
            + "(\\d{2})            # day (group 3)";
    Pattern pattern = Pattern.compile(re);
    Stream.of("2018-12-07", "2018.12.07", "2018/12/07").forEach(aTest -> {
        System.out.println("**************** Testing: " + aTest);
        final Matcher matcher = pattern.matcher(aTest);
        if (matcher.find()) {
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group - " + i + ": " + matcher.group(i));
            }
        }
    });
}
publicstaticvoidmain(字符串[]args){
字符串re=“(?x)”
+“#(?x)是自由间距标志\n”
+“#第一个和最后一个之间的任何内容都将被忽略\n”
+#在自由间距模式下,忽略正则表达式标记之间的空白\n
+“(19 | 20\\d\\d)#年(第1组)\n”
+“[-/\.]\\分隔符\n”
+“(\\d{2})月(第2组)\n”
+“[-/\.]\\分隔符\n”
+“(\\d{2})日(第3组)”;
Pattern=Pattern.compile(re);
forEach(aTest->{
System.out.println(“****************测试:“+aTest”);
最终匹配器匹配器=模式匹配器(aTest);
if(matcher.find()){

对于(int i=1;i,如果您的语言支持,您可以使用在正则表达式中添加注释。在自由间距模式下,将忽略空格(注意事项适用),并且您可以使用
符号添加注释

教程中的示例
如果您使用的是Perl,只需启用
/x
标志,并在正则表达式中添加空格和注释:

qr{
.#用户名
/
.*envName
/
.*serviceName
/
.#数据类型
/
*日期
/
*主机
/
(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*.#文件名
}x
也就是说,如果这是您的意思(一系列非斜杠字符),那么所有这些
*
可能都应该是
[^/]*

您还可以从具有合理名称的变量构建模式:

我的$userName=
我的名字=
我的$serviceName=
我的$dataType=
我的美元约会=
my$host=qr{[^/]*};
我的$fileName=qr{(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*};
...
qr{$userName/$envName/$serviceName/$dataType/$date/$host/$fileName}

这种模式看起来非常糟糕。正则表达式中出现的任何
*
都是一个危险信号;单个正则表达式中的8个肯定是一个bug。x-site duplicate@AlexeiLevenkov非常感谢链接,非常详细。
# Match a 20th or 21st century date in yyyy-mm-dd format
(19|20)\d\d                # year (group 1)
[- /.]                     # separator
(0[1-9]|1[012])            # month (group 2)
[- /.]                     # separator
(0[1-9]|[12][0-9]|3[01])   # day (group 3)