【问题标题】:Confused on a basic operation of regular expressions对正则表达式的基本操作感到困惑
【发布时间】:2014-03-05 21:44:57
【问题描述】:

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

.  Matches any single character  
*  Matches the **preceding** element zero or more times  

那么现在根据这个定义,.* 为什么不尝试匹配字符串中的 first 字符 0 次或更多次,而是尝试将匹配应用到 each 字符串中的字符?
我的意思是如果我有abc,它应该尝试匹配a,aa,aaa etc,对吗?
但它没有:

 ~
$ perl -e '  
> my $var="abcdefg";  
> $var =~ /(.*)/;   
> print "$1\n";'   
abcdefg   

【问题讨论】:

  • 我不确定是否有比以下更好的答案:不,因为它不是这样定义的。
  • @OliCharlesworth:维基百科的定义似乎与我的假设(或混淆)并不矛盾
  • 我的意思是,您对.* 的含义的假设与定义不符。

标签: regex dfa nfa


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      字符点. 匹配任意元素

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

      作者:

      前面的元素零次或多次

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

      这就像写.?.? 和无数次。

      【讨论】:

        【解决方案4】:

        混淆始于Matches the **preceding** element zero or more times 中的“元素”一词。这里的术语“前置元素”是指“前置pattern”而不是“前置capture”(或“前置match”)。

        【讨论】:

        • 所以“前面的模式”预计会被找到 0 次或更多次。我看不出这与我所要求的有何不同
        • 不同,因为您将“先前模式”解释为“先前模式的结果”。
        • .* 表示“任何字符 0 次或更多次”而不是“可选地找到任何重复自身 1 次或多次的字符”。在此处查阅反向引用:stackoverflow.com/questions/644714/…,差异可能会变得更加清晰。
        • 还可以参考贪婪与非贪婪匹配,以了解 * 操作员何时决定停止捕获。
        【解决方案5】:

        这个:

        .{2,4}
        

        真的是这个的简写:

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

        同理,这样:

        .*
        

        真的是这个的简写:

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

        【讨论】:

        • 是的,但这并没有说明为什么根据元字符 . 的定义方式这些是等价的
        • @Jim:你到底在寻找什么“为什么”?上述等式适用于任何字符类,无论是a[0-9] 还是.
        • x*x?x?x?x?x?...不一样吗?如果是,那么为什么不将 .* 翻译为尝试匹配相同的元素这让我感到困惑
        • @Jim:这是另一种解释,是的。所以.* 将是.?.?.?...。每个. 都独立于其他.
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 2016-04-06
          相关资源
          最近更新 更多