我对正则表达式有一个相当基本的问题
我使用表达式.*
而不考虑匹配期望匹配,例如直到最后一行。这有效。
但出于某种原因,我开始考虑这个表达。检查Wikipedia(我的重点)
. Matches any single character
* Matches the **preceding** element zero or more times
所以现在根据这个定义,为什么.*
尝试不匹配字符串中的第一个字符0次或更多次,而是尝试将匹配应用于字符串中的每个字符?
我的意思是如果我abc
它应该尝试匹配a,aa,aaa etc
对吗?
但事实并非如此:
~
$ perl -e '
> my $var="abcdefg";
> $var =~ /(.*)/;
> print "$1\n";'
abcdefg
答案 0 :(得分:2)
混淆从Matches the **preceding** element zero or more times
中的“元素”一词开始。术语“前面的元素”在这里指的是“前面的模式”而不是“前面的捕获”(或“前面的匹配”)。
答案 1 :(得分:2)
此:
.{2,4}
真的是速记:
(..)|(...)|(....)
以同样的方式,这个:
.*
真的是速记:
()|(.)|(..)|(...)| // etc.
答案 2 :(得分:2)
。正则表达式没有内存。一旦它匹配“abc”中的“a”,它就会在尝试匹配“b”时忘记它。
答案 3 :(得分:1)
*
适用于正则表达式的前一个元素零次或多次 - 请注意您链接的页面是指“模式元素”。因此,当在字符串的开头尝试匹配时,它匹配任何单个字符;然后它匹配任何单个字符等。
同样,如果您说(A|B)*
,则不会选择A
或B
中的一个,然后重复匹配;它选择A
或B
中的一个然后“重新开始”。
答案 4 :(得分:1)
根据维基百科的粘贴,.
表示任何单个字符。这并不仅仅意味着第一个字符,但实际上,正如它所说的那样,任何字符 - 也就是说,任何类型的字符(相反,比如数字或白色空格类型字符) )。所以你说,匹配0次或更多次any type of character at all
,这当然与你的整行匹配。
答案 5 :(得分:1)
字符点.
匹配任何元素
现在,字符*
匹配前面的元素(在我们的例子中是任何元素)0次或更多次。
人:
前面的元素为零次或多次
元素表示.
,而不是前面的字符匹配。它与以前的比赛无关。它只重复点0次或更多次。
这就像写.?.?
和无限的时间。