对正则表达式的基本操作感到困惑

时间:2014-02-08 11:23:30

标签: regex dfa nfa

我对正则表达式有一个相当基本的问题 我使用表达式.*而不考虑匹配期望匹配,例如直到最后一行。这有效。
但出于某种原因,我开始考虑这个表达。检查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   

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

此:

.{2,4}

真的是速记:

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

以同样的方式,这个:

.*

真的是速记:

()|(.)|(..)|(...)| // etc.

答案 2 :(得分:2)

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

答案 3 :(得分:1)

*适用于正则表达式的前一个元素零次或多次 - 请注意您链接的页面是指“模式元素”。因此,当在字符串的开头尝试匹配时,它匹配任何单个字符;然后它匹配任何单个字符等。

同样,如果您说(A|B)*,则不会选择AB中的一个,然后重复匹配;它选择AB中的一个然后“重新开始”。

答案 4 :(得分:1)

根据维基百科的粘贴,.表示任何单个字符。这并不仅仅意味着第一个字符,但实际上,正如它所说的那样,任何字符 - 也就是说,任何类型的字符(相反,比如数字或白色空格类型字符) )。所以你说,匹配0次或更多次any type of character at all,这当然与你的整行匹配。

答案 5 :(得分:1)

字符点.匹配任何元素

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

人:

  

前面的元素为零次或多次

元素表示.,而不是前面的字符匹配。它与以前的比赛无关。它只重复点0次或更多次。

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

相关问题