Intellij Idea 为什么我的RegEx只给我一个元素,而不是Java中的完整组?

ltskdhd1  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(162)

我是新来的,这是我的第一篇文章。我也是Java和RegEx的新手。所以…
我正在使用Java编写一个RegEx,以匹配聊天中的电话号码,格式如下:+XXX (XXX) XXX XXXX用数字和/或文字书写。
这是我的regex:
"\\+?(zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){1,3}?[._\\-]? \\(?(zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){3}\\)?[._\\-]? (zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){3}[._\\-]?(zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){4}";
然后使用方法.group()来打印完整的匹配,它工作得很好,但如果我想用这个循环打印每个不同的组:

for (int i = 1; i <= match.groupCount(); i++) {
    if (match.group(i) != null) {
        System.out.println("Group " + i + ": " + match.group(i));
    }
}

而每一个字,都是一个字,一个字,一个字,一个字。
为什么会这样?我需要做什么来打印每个组的每个元素?
我也试过这个正则表达式
"\\+?(zero{1,3}|uno{1,3}|due{1,3}|tre{1,3}|quattro{1,3}|cinque{1,3}|sei{1,3}|sette{1,3}|otto{1,3}|nove{1,3}|\\d{1,3})?[._\\-]?\\(?(zero{3}|uno{3}|due{3}|tre{3}|quattro{3}|cinque{3}|sei{3}|sette{3}|otto{3}|nove{3}|\\d{3})\\)?[._\\-]?(zero{3}|uno{3}|due{3}|tre{3}|quattro{3}|cinque{3}|sei{3}|sette{3}|otto{3}|nove{3}|\\d{3})[._\\-]?(zero{4}|uno{4}|due{4}|tre{4}|quattro{4}|cinque{4}|sei{4}|sette{4}|otto{4}|nove{4}|\\d{4})";
还有这个
"\\+?(zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d{1,3})?[._\\-]?\\(?(zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d{3})\\)?[._\\-]?(zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d{3})[._\\-]?(zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d{4})";
提前感谢!:)

brtdzjyr

brtdzjyr1#

你需要将你的组设置为non-capturing(?: ... ),然后将它们 Package 成捕获组。类似于:

"\\+?((?:zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){1,3}?)[._\\- ]?\\(?((?:zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){3})\\)?[._\\- ]?((?:zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){3})[._\\- ]?((?:zero|uno|due|tre|quattro|cinque|sei|sette|otto|nove|\\d){4})";

推理:如果组匹配多次,则仅捕获最后一次出现。
此外,我还将空格放入分隔符的符号类中。

相关问题