Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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,鉴于以下内容,我想使用Java中的模式类提取一些值: user1@machine1:command#user2@machine2:command.... 将提取两个命令: 使用user1在machine1上执行的一个 一个将使用user2在machine2上执行 如果我使用下面的正则表达式 "([^@]+)@([^:]+):([^#]+)(?:#([^@]+)@([^:]+):([^#]+))*" 第1、4、7组中的元素。。。是用户吗 第2、5、8组中的元素。。。是机器吗 第3、6、9组

鉴于以下内容,我想使用Java中的模式类提取一些值:

user1@machine1:command#user2@machine2:command....
将提取两个命令:

  • 使用user1在machine1上执行的一个
  • 一个将使用user2在machine2上执行
如果我使用下面的正则表达式

"([^@]+)@([^:]+):([^#]+)(?:#([^@]+)@([^:]+):([^#]+))*"
第1、4、7组中的元素。。。是用户吗

第2、5、8组中的元素。。。是机器吗

第3、6、9组中的元素。。。是命令吗

唯一的问题是,对于只有一个命令,匹配器检测到4、5、6的空组

对于这种特殊情况,有没有不接收空值的正则表达式选项?

为什么不检查一下呢

if (myMatcher.find()) {
    if (myMatcher.group(4) == null) {
        // TODO
    }
    // etc

我认为当有3个或更多的命令时,您会遇到更大的问题。您可能只需
。首先拆分(“#”)字符串,然后分别处理每个字符串。

我建议将进程分为两部分:首先,查找
user@group:命令,然后识别该块中的零件。这样,它将适用于任意数量的块

首先,删减正则表达式以只匹配一个“块”:

然后,使用
String.split(“#”)分割块,并使用正则表达式匹配该块:

for (String block : input.split("#")) {
    Matcher m = p.matcher(block);
    if (m.matches()) {
        System.out.println(m.groupCount());
        for (int i = 0; i < m.groupCount(); i++) {
            System.out.println(m.group(i + 1));
        }
    }
}

无法禁用返回空匹配(Java ICU regex中没有分支重置),因此只能按照Mena的建议执行空检查。这样的检查会使代码无法读取。我应该把它们作为最后的手段,我不同意它们让代码变得不可读。也许只是有点乱。在我看来,没有什么不能用好的文档来修复的。好主意。这将简化正则表达式和处理转换的代码。谢谢你作为第一个在评论中给我最合适答案的用户,你应该得到这个答案。非常感谢。
for (String block : input.split("#")) {
    Matcher m = p.matcher(block);
    if (m.matches()) {
        System.out.println(m.groupCount());
        for (int i = 0; i < m.groupCount(); i++) {
            System.out.println(m.group(i + 1));
        }
    }
}
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println(m.groupCount());
    for (int i = 0; i < m.groupCount(); i++) {
        System.out.println(m.group(i + 1));
    }
}