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

时间:2018-04-19 13:23:30

标签: java regex regex-negation

我正在使用可以采用此格式的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] 

我们非常感谢任何建议,特别是在模式表达部分

2 个答案:

答案 0 :(得分:2)

\\D表示包含_的每个非数字。要消除它,请使用\\D运算符创建intersection [^_]&&个集合。尝试使用[\\D&&[^_]]+代替\\D+|[^_]*

或者由于\D取消\d,我们可以使用De Morgan定律~p AND ~q~(p OR q)相同并将其重写为{{1} }}。

答案 1 :(得分:0)

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

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