4

我有一个关于正则表达式的相当基本的问题。
我使用表达式.*而不考虑它匹配期望匹配例如到行尾。这行得通。
但出于某种原因,我开始思考这个表达方式。检查维基百科(我的重点)

.  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   
4

6 回答 6

2

这 。正则表达式没有记忆。一旦它匹配“abc”中的“a”,它就会在尝试匹配“b”时忘记它。

于 2014-02-08T11:33:35.013 回答
2

混乱始于 中的“元素”一词Matches the **preceding** element zero or more times。这里的术语“在前元素”是指“在前模式”而不是“在前捕获”(或“在前匹配”)。

于 2014-02-08T11:29:54.857 回答
2

这个:

.{2,4}

真的是这个的简写:

(..)|(...)|(....)

以同样的方式,这:

.*

真的是这个的简写:

()|(.)|(..)|(...)| // etc.
于 2014-02-08T11:30:26.640 回答
1

* applies to the preceding element of the regular expression zero or more times - notice the page you link refers to a "pattern element". Therefore when attempting a match at the start of the string, it matches any single character; then it matches any single character, etc.

Similarly if you say (A|B)*, it doesn't pick one of A or B then match it repeatedly; it picks one of A or B then "starts over".

于 2014-02-08T11:28:06.083 回答
1

根据维基百科的粘贴,这.意味着任何单个字符。这不仅仅意味着第一个字符,而是真的,正如它所说的那样,任何字符 - 即任何类型的字符(与数字或空白类型字符相反)。所以你说,匹配 0 次或多次出现any type of character at all,这当然匹配你的整行。

于 2014-02-08T11:29:19.000 回答
1

字符点.匹配任何元素

现在字符*匹配前面的元素(在我们的例子中是任何元素)0 次或更多次。

经过:

前面的元素零次或多次

element 表示.与前面的字符不匹配。和之前的比赛没有任何关系。它只会重复点 0 次或更多次。

这就像写作.?.?和无限的时间。

于 2014-02-08T11:29:51.260 回答