匹配单词与匹配单词正则表达式匹配

时间:2015-05-09 10:27:56

标签: ruby regex

为什么当我匹配新行时,我似乎无法识别单个单词。例如:

content = "COAL_STORIES
AUSTRALIA - blah blah blah
BOTSWANA – blah blah blah 

URANIUM_STORIES 
AUSTRALIA – blah
INDIA - blah

COPPER_STORIES
AUSTRALIA - blah blah blah
AUSTRALIA - blah blah blah
CHINA - blah blah blah

ALUMINIUM_STORIES"




sections = content.scan(/\w.*_.*\b/)

Give和array:

[
    [0] "COAL_STORIES",
    [1] "URANIUM_STORIES",
    [2] "COPPER_STORIES",
    [3] "ALUMINIUM_STORIES"
]

但如果我尝试使用'm'标志,一切都会匹配:

sections = content.scan(/\w.*_.*\b/m)给出一个数组:

[
    [0] "COAL_STORIES\nAUSTRALIA - blah blah blah\nBOTSWANA – blah blah blah \n\nURANIUM_STORIES \nAUSTRALIA – blah\nINDIA - blah\n\nCOPPER_STORIES\nAUSTRALIA - blah blah blah\nAUSTRALIA - blah blah blah\nCHINA - blah blah blah\n\nALUMINIUM_STORIES"
]

据我所知,我仍然在寻找相同的单词边界?

1 个答案:

答案 0 :(得分:2)

详细说明卡西米尔的评论:

.*贪婪...它会匹配尽可能长的字符串,包括新行(如果你允许的话)(你可以/通过启用与\m的多行匹配来完成)。

在您的第一个示例中,.*与新换行不匹配,因此\b被强制匹配与\w匹配的同一行上的字边界。

在第二个示例中,.*会匹配不同的行,因此当\w与您的第一个字符匹配时,\b可以自由匹配任何字边界,甚至可以在很多行之外匹配,只要在两者之间的某处有一个_。具体来说,对你来说,它看起来像:

  • \w匹配您输入中的第一个字符:" C"来自" COAL_STORIES"
  • .*将所有内容与" ALUMINUM"匹配在最后一行
  • _匹配" _"
  • .*匹配" STORIES"
  • \b与" STORIES"
  • 的结尾相匹配