如何从正则表达式组中排除下划线 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
我正在使用可以采用这种格式的 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