Java 排除空正则表达式组
鉴于以下内容,我想使用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组
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));
}
}