为什么这个正则表达式选择这个文本

时间:2015-03-18 10:04:17

标签: regex

我正在使用正则表达式

(.*)\d.txt

表达式

MyFile23.txt

现在在线测试人员说使用上面的正则表达式将允许(选择)所提到的字符串。我的理解是不应该允许它,因为有两个数字2和3,而上面的正则表达式只有一个数字,即\d。它应该是\d+。我目前的表达是读。任何字符后跟一个数字后跟.txt的零个或多个。我的问题是为什么上面的字符串传递正则表达式?

3 个答案:

答案 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"匹配正则表达式模式:

enter image description here

文字句点.应始终转义为\.,否则它将匹配"任何字符"。

最后,(.*)匹配从开头到最后一位(MyFile2)的所有字符串。看看" MATCH INFORMATION"右侧区域at this page

所以,我建议以下修复

^\D*\d\.txt$ =行/字符串的开头,非数字字符,任意数量的重复,数字,文字句点,文字txt以及字符串/行的结尾(取决于m开关,它取决于输入字符串,是否在单独的行上有单词列表,或者只是单独的文件名。 这是working example

答案 2 :(得分:2)

您拥有的模式有一个组(。*),可以使用您的示例进行匹配:MyFile2

因为。允许任何角色。 而且。在该组未被转义后的模式中,这将导致允许任何类型的另一个角色。

为避免这种用途:

(\D*)\d+\.txt

组(\ D *)现在将匹配所有非数字字符。