2015-10-14 118 views
0

在rererence到这个问题后:https://softwareengineering.stackexchange.com/questions/291273/why-regex-when-using-global-search-and-0-quantifier-match-the-end-of-the-stRegular expression to match a line that doesn't contain a word?正则表达式 - 文档之前空字符串和字符

空字符串的前和后的每个字母是未知的,我的解释。我第一次听到这个。我还能在哪里读到它,因为我现在有点困惑,无法找到任何其他来源。

+1

http://www.regular-expressions.info/ – hjpotter92

+0

这并不是说有“空字符串前,每个字母后”。你的查询的答案在你连接的问题的答案中...... _“你的正则表达式匹配'''空字符串与'd *',因为'*'量词意味着零次或多次,这是零'd'这里。“_ – msanford

回答

4

在匹配正则表达式时,解释器首先尝试匹配字符串中的索引0。

  • 如果没有匹配,则前进到下一个索引并再次尝试。
  • 如果有匹配,则返回该匹配,然后在匹配结束时尝试再次匹配。如果最后一个匹配符与空字符串匹配,则前进到下一个字符。

依此类推,对于每个匹配(匹配时)或每个字符(当没有匹配时)。

正则表达式d*中的问题是它接受空匹配 - 它表示空字符串匹配模式。这意味着你会总是获得一场比赛。

让我们尝试在dddxdddd字符串d*模式:

这里的初始位置:

dddxdddd  matches: [] 
^ 

^真的意味着光标第一d之前。你应该将光标看作是之间的这两个字符串。这将帮助您了解匹配过程。

所以让我们只需要插入虚构空间来说明:

d d d x d d d d  matches: [] 
^ 

我们拿到的第一场比赛在这里,作为第一个字符是一个d

dddxdddd 
\_/ 

比赛结束后,我们将在光标位于dx之间:

d d d x d d d d  matches: ["ddd"] 
    ^

我们尝试再次匹配。该匹配成功与dx之间的空字符串。当我们得到一个空的比赛,我们提前光标:

d d d x d d d d  matches: ["ddd", ""] 
     ^

我们然后尝试再次匹配,而我们得到的dddd子:

dddxdddd 
    \__/ 

我们将光标后:

d d d x d d d d  matches: ["ddd", "", "dddd"] 
       ^

所以它现在在最后的d和字符串的末尾之间。同样,我们尝试的比赛,我们有一个空字符串成功:

d d d x d d d d  matches: ["ddd", "", "dddd", ""] 
       ^

如果我们试图向前移动光标,现在将过去的字符串的结尾,这意味着我们已经找到了所有的比赛,我们完成了。

最终结果:

["ddd", "", "dddd", ""] 
+0

它终于有道理。谢谢你的例子,以及bulleted points .. :-) – airnet

相关问题