这是我的regex
我正在尝试捕获文件* 08.tgz,* 09.tgz和* 01.tgz
这就是我所拥有的。但由于09
.*\/*[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
答案 0 :(得分:1)
您将字符类误用为一个组。您的正则表达式.*\/*[09|8|1].tgz
会尽可能多地匹配除换行符之外的零个或多个字符(使用.*
)(因为*
是一个贪婪的量词),后跟零个或多个{{1} }符号,然后是字符类/
中的1个符号 - 即[09|8|1]
,0
,9
,|
或{{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]
是字符类,尝试匹配所包含的任何字符 - 因此它会匹配0
或9
或8
或1
或|
您可能正在寻找0[189]
匹配0
后跟1
或8
或9
答案 2 :(得分:1)
我会明确并使用
.*\/*(08|09|01).tgz
答案 3 :(得分:1)
让我们看一下正则表达式的这一部分,其中正在进行数字的实际匹配。
[09|8|1]
说
0
或9
8
1
|
现在你认为它匹配10.tgz
。但它实际上匹配0.tgz
当你将其更改为[9|8|1]
时,它会说。
9
8
1
|
现在0.tgz
赢了。
答案 4 :(得分:1)
你已经混淆了角色类和交替。
试试这个:
.*0(9|8|1)\.tgz
或更简单:
.*0[981]\.tgz
另请注意修复正则表达式的其他部分。