有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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也需要同样的功能


共 (2) 个答案

  1. # 1 楼答案

    您可以使用重复模式匹配1个或多个数字,重复模式以匹配-_开始,以防止匹配连续的__

    ^\d+_[a-f0-9]+(?:[_-][a-f0-9]+)+_p\.dat$
    

    解释

    • ^字符串的开头
    • \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中,必须对反斜杠进行双转义:

    String regex = "^\\d+_[a-f0-9]+(?:[_-][a-f0-9]+)+_p\\.dat$";
    

    要精确匹配这些数字,可以使用alternationcharacter classes来匹配这些数字,并稍微缩短模式:

    ^(?:2[2-689]|3[25]|4[016]|52|70|8[58]|123)_[a-f0-9]+(?:[_-][a-f0-9]+)+_p\.dat$
    

    Regex demo

  2. # 2 楼答案

    你的语法不正确。此正则表达式匹配所有文件名:

    [0-9]+_[0-9a-z_-]+_p\.dat
    

    我把它拆开解释一下

    [0-9]+匹配一个或多个数字,即每个文件名开头的数字(即22)。你可以让它更具体,就像你在例子中所做的那样,并匹配(22|23|24),读起来像222324

    _匹配下划线

    [0-9a-z_-]+匹配“GUID”部分,它可以是一个或多个数字、小写字母、下划线和连字符

    _p\.dat匹配下划线、字母p、句点(注意,这是用\转义的,因为.是一个特殊的正则表达式字符)和结尾的dat后缀

    我使用regex101来处理正则表达式,试试看,它也有一个很好的帮助部分