我正在使用可以采用此格式的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]
我们非常感谢任何建议,特别是在模式表达部分
答案 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