我正在使用正则表达式
(.*)\d.txt
表达式
MyFile23.txt
现在在线测试人员说使用上面的正则表达式将允许(选择)所提到的字符串。我的理解是不应该允许它,因为有两个数字2和3,而上面的正则表达式只有一个数字,即\d
。它应该是\d+
。我目前的表达是读。任何字符后跟一个数字后跟.txt的零个或多个。我的问题是为什么上面的字符串传递正则表达式?
答案 0 :(得分:4)
此正则表达式(.*)\d.txt
仍将匹配MyFile23.txt
,因为.*
将匹配任何字符(包括数字)中的0个或更多。
因此对于给定的输入:MyFile23.txt
这里是分手:
.* # matches MyFile2
\d # matched 3
. # matches a dot (though it can match anything here due to unescaped dot)
txt # will match literal txt
要确保它只匹配MyFile2.txt
,您可以使用:
^\D*\d\.txt$
其中^
和$
是匹配开头和结尾的锚点。 \D*
将匹配0或更多非数字。
答案 1 :(得分:2)
以下是解释,您的" MyFile23.txt"匹配正则表达式模式:
文字句点.
应始终转义为\.
,否则它将匹配"任何字符"。
最后,(.*)
匹配从开头到最后一位(MyFile2
)的所有字符串。看看" MATCH INFORMATION"右侧区域at this page。
所以,我建议以下修复:
^\D*\d\.txt$
=行/字符串的开头,非数字字符,任意数量的重复,数字,文字句点,文字txt
以及字符串/行的结尾(取决于m
开关,它取决于输入字符串,是否在单独的行上有单词列表,或者只是单独的文件名。
这是working example。
答案 2 :(得分:2)
您拥有的模式有一个组(。*),可以使用您的示例进行匹配:MyFile2
因为。允许任何角色。 而且。在该组未被转义后的模式中,这将导致允许任何类型的另一个角色。
为避免这种用途:
(\D*)\d+\.txt
组(\ D *)现在将匹配所有非数字字符。