java - 正则表达式捕获组

标签 java regex

我的组可以是 x/y、x.y 或 x_y.z 形式。每个组由下划线分隔。这些组是无序的。

例子:

ABC/DEF_abc.def_PQR/STU_ghi_jkl.mno

我想捕捉以下内容:

ABC/DEF
abc.def
PQR/STU
ghi_jkl.mno

我已经使用相当冗长的字符串迭代和解析方法(如下所示)完成了此操作,但我想知道一个简单的正则表达式是否可以完成此操作。

private static ArrayList<String> go(String s){
    ArrayList<String> list = new ArrayList<String>();
    boolean inSlash = false;
    int pos = 0 ;
    boolean inDot = false;
    for(int i = 0 ; i < s.length(); i++){
        char c = s.charAt(i);
        switch (c) {
        case '/':
            inSlash = true;
            break;
        case '_':
            if(inSlash){
                list.add(s.substring(pos,i));
                inSlash = false;
                pos = i+1 ;
            }
            else if (inDot){
                list.add(s.substring(pos,i));
                inDot = false;
                pos = i+1;
            }
            break;
        case '.':
            inDot = true;
            break;
        default:
            break;
        }

    }
    list.add(s.substring(pos));
    System.out.println(list);
    return list;
}

最佳答案

尝试一下:

((?:[^_./]+/[^_./]+)|(?:[^_./]+\.[^_./]+)|(?:[^_./]+(?:_[^_./]+)+\.[^_./]+))

我不知道 java 语法,但在 Perl 中:

#!/usr/bin/perl
use 5.10.1;
use strict;
use warnings;

my $str = q!ABC/DEF_abc.def_PQR/STU_ghi_jkl.mno_a_b_c.z_a_b_c_d.z_a_b_c_d_e.z!;
my $re = qr!((?:[^_./]+/[^_./]+)|(?:[^_./]+\.[^_./]+)|(?:[^_./]+(?:_[^_./]+)+\.[^_./]+))!;
while($str=~/$re/g) {
    say $1;
}

将产生:

ABC/DEF
abc.def
PQR/STU
ghi_jkl.mno
a_b_c.z
a_b_c_d.z
a_b_c_d_e.z

关于java - 正则表达式捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4387531/

相关文章:

javascript - Tomcat 7 Websocket 握手 : Unexpected response code: 404

java - Datastax Cassandra java 驱动程序 - 对象映射器 - 自动创建表

关键字的正则表达式

Python 正则表达式与 IMDB 前 250 名列表

python - 我可以将正则表达式否定后向断言应用于整个表达式吗?

java - Google Java Style 的 Checkstyle 规则

java - java中Do/While循环的问题

java - 枚举类内存泄漏

regex - Notepad++ 函数列表 : return class even if empty

php - 正则表达式用引号匹配单词边界