regexjava:要读取的正则表达式。语法为40_*_p.dat的dat文件
我收到17种文件,格式如下:
85_*_p.dat
88_*_p.dat
32_*_p.dat
40_*_p.dat
41_*_p.dat
70_*_p.dat
22_*_p.dat
23_*_p.dat
46_*_p.dat
24_*_p.dat
25_*_p.dat
26_*_p.dat
52_*_p.dat
123_*_p.dat
28_*_p.dat
29_*_p.dat
35_*_p.dat
其中*是任何类似“40_20200313_0cd69633f-bf5b-4eb0-b310-255a23ed778e_p.dat”的GUID。85、88等数字是接口号。下划线以及“_p.dat”是所有文件的常用数字
如何编写包含上述所有文件的正则表达式
尝试过但没有成功:
/[22][23][24][25][26][28][29][32][35][40][41][46][52][70][85][88][123]_(?:.*)_p.dat/
还尝试了:
\d[22|23|24|25|26|28|29|32|35|40|41|46|52|70|85|88|123]_(?:.*)_p.dat
这是错误的,如果我加123,那么它也会选择23
还尝试了:
(22|23|123)_(?:.*)_p.dat
它给出了正常组和第1组的两个结果
不知道该怎么处理
注意:ApacheCamel具有通过正则表达式读取SFTP文件的功能。我想为上述所有文件创建正则表达式。但Java也需要同样的功能
# 1 楼答案
您可以使用重复模式匹配1个或多个数字,重复模式以匹配
-
或_
开始,以防止匹配连续的__
解释
^
字符串的开头\d+_
匹配1+个数字并匹配_
[a-f0-9]+
匹配1+乘以a-f或0-9(?:
非捕获组[_-][a-f0-9]+
匹配_
或-
和1+乘以a-f或0-9)+
关闭非捕获组,重复1+次_p\.dat
匹配_p.dat
$
字符串结尾Regex demo
注意在Java中,必须对反斜杠进行双转义:
要精确匹配这些数字,可以使用alternation和character classes来匹配这些数字,并稍微缩短模式:
Regex demo
# 2 楼答案
你的语法不正确。此正则表达式匹配所有文件名:
我把它拆开解释一下
[0-9]+
匹配一个或多个数字,即每个文件名开头的数字(即22
)。你可以让它更具体,就像你在例子中所做的那样,并匹配(22|23|24)
,读起来像22
或23
或24
_
匹配下划线[0-9a-z_-]+
匹配“GUID”部分,它可以是一个或多个数字、小写字母、下划线和连字符_p\.dat
匹配下划线、字母p
、句点(注意,这是用\
转义的,因为.
是一个特殊的正则表达式字符)和结尾的dat
后缀我使用regex101来处理正则表达式,试试看,它也有一个很好的帮助部分