如何从正则表达式组中排除下划线 java

How to exclude underscore from regex group java

我正在使用可以采用这种格式的 excel 个文件的名称 table_A_Apr_2000.xlsx 并且我想要一个表达式,它将给我组作为表单

下面的字符串对象
                [table_A, Apr, 2000, .xlsx]

当我在我的代码中使用这个表达式时

       String table="table_A";
     String[] slist = {"table_A_Apr_2001.xlsx"};
    Pattern p = Pattern.compile("^"+table+"|\d+|\D+|[^_]*");

    for(int i=0; i<slist.length;i++){

        Matcher m = p.matcher(slist[i]);
        List<String> a = new ArrayList<String>();
        while(m.find()){
            a.add((m.group()));
        }

        System.out.println(a);
        System.out.println("~~~~~");

    }

它给出以下输出

       [table_A, _Apr_, 2001, .xlsx, ]
   but I want it to be like 
       [table_A, Apr, 2000, .xlsx] 

任何建议将不胜感激,尤其是在模式表达部分

\D表示包含_的所有非数字。要消除它,请使用 && 运算符创建 intersection of \D[^_] 集合。尝试使用 [\D&&[^_]]+ 而不是 \D+|[^_]*

OR 由于\D\d的否定,我们可以利用德摩根定律~p AND ~q~(p OR q)相同并将其重写为[^\d_]+ .

可以使用正式的正则表达式匹配器,但这里可能可行的一个选项是对文件名进行智能拆分:

String filename = "table_A_Apr_2001.xlsx";
filename = filename.substring(0, filename.indexOf('.'));
String[] parts = filename.split("_(?=[^_]{3,})");

System.out.println("table: " + parts[0]);
System.out.println("month: " + parts[1]);
System.out.println("year: " + parts[2]);

table: table_A
month: Apr
year: 2001

Demo