正则表达式+选择文件结尾

时间:2016-03-10 21:55:16

标签: regex

这是我的regex

我正在尝试捕获文件* 08.tgz,* 09.tgz和* 01.tgz

这就是我所拥有的。但由于09

,他也会捕获* 10.tgz

.*\/*[09|8|1].tgz

我知道我可以做.*\/*[9|8|1].tgz这只会捕获* 08.tgz,* 09.tgz和* 01.tgz,但我想了解的是为什么0捕获10.tgz文件??

数据

./backup_public_html_20160308.tgz
./backup_public_html_20160301.tgz
./backup_public_html_20160302.tgz
./backup_public_html_20160306.tgz
./backup_public_html_20160304.tgz
./backup_public_html_20160303.tgz
./backup_public_html_20160307.tgz
./backup_public_html_20160305.tgz
./backup_public_html_20160309.tgz
./backup_public_html_20160310.tgz

5 个答案:

答案 0 :(得分:1)

您将字符类误用为一个组。您的正则表达式.*\/*[09|8|1].tgz会尽可能多地匹配除换行符之外的零个或多个字符(使用.*)(因为*是一个贪婪的量词),后跟零个或多个{{1} }符号,然后是字符类/中的1个符号 - 即[09|8|1]09|或{{1}跟随任何字符,但换行符(因为8匹配任何字符而不是换行符),然后是1

有关角色类如何工作的更多详细信息,请参阅Character classes or Character Sets

  

使用"字符类",也称为"字符集",您可以告诉正则表达式引擎只匹配多个字符中的一个。只需将要匹配的字符放在方括号中即可。如果您想匹配.tgz,请使用a。您可以在e中使用此选项来匹配[ae]gr[ae]y

     

在大多数正则表达式中,字符类中唯一的特殊字符或元字符是右括号(gray),反斜杠(grey),插入符号(]),和连字符(\)。 usual metacharacters是字符类中的普通字符,不需要通过反斜杠进行转义。要搜索星标或加号,请使用^。如果你逃避字符类中的常规元字符,你的正则表达式将正常工作,但这样做会大大降低可读性。

要捕获文件* 08.tgz,* 09.tgz和* 01.tgz,请使用

-

OR

[+*]

请参阅regex demo.*0[981]\.tgz 是字符串锚点的开头,^.*0[981]\.tgz$ 是字符串锚点的结尾,因此^模式将需要完整的字符串匹配。

注意:要匹配文字$,您需要将其放置或放置..是的,进入角色类^.*0[981]\.tgz$失去其特殊意义并且只是表示那里的文字点。

请参阅regex demo

答案 1 :(得分:1)

[09|8|1]是字符类,尝试匹配所包含的任何字符 - 因此它会匹配0981|

您可能正在寻找0[189]匹配0后跟189

答案 2 :(得分:1)

我会明确并使用

.*\/*(08|09|01).tgz

答案 3 :(得分:1)

让我们看一下正则表达式的这一部分,其中正在进行数字的实际匹配。

[09|8|1]

  • 09

  • 8

  • 1

  • |

现在你认为它匹配10.tgz。但它实际上匹配0.tgz

当你将其更改为[9|8|1]时,它会说。

  • 9

  • 8

  • 1

  • |

现在0.tgz赢了。

答案 4 :(得分:1)

你已经混淆了角色类和交替。

试试这个:

.*0(9|8|1)\.tgz

或更简单:

.*0[981]\.tgz

另请注意修复正则表达式的其他部分。