Ruby 跨行匹配与匹配单词regex

Ruby 跨行匹配与匹配单词regex,ruby,regex,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 AL

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

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/)
给出和数组:

[
    [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"
]

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

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

*
是贪婪的。。。它将匹配尽可能长的字符串,包括允许的换行符(通过启用多行匹配
\m
),您可以/确实做到这一点)

在第一个示例中,
*
将不匹配换行符,因此
\b
将被强制匹配与
\w
匹配位置相同的行上的单词边界

在第二个示例中,
*
将跨行匹配,因此当
\w
匹配第一个字符时,
\b
可以自由匹配任何单词边界,即使是许多行之外,只要这两个字符之间有一个
\u
。具体来说,对您来说,它看起来像:

  • \w
    匹配了输入中的第一个字符:“煤炭故事”中的“C”
  • *
    将所有内容匹配到最后一行的“Aluminal”
  • \u
    匹配的“\u”
  • *
    匹配的“故事”
  • \b
    匹配“故事”的结尾

*
这样的量词在默认情况下是贪婪的,
表示所有字符(包括带m修饰符的换行符)。这就是为什么
\b
是字符串的最后一个。所以你得到了最长的结果。因为第一种方法似乎有效,你想达到什么目的呢?好吧,断线也可以,因为在正确的位置总是会有断线。Regex目前似乎总是给我带来令人惊讶的结果,所以我试图更好地理解我实际上需要匹配,好像没有换行符…没有换行符,您可以尝试这样的操作:
\b\w+?\uw+\b
,但是如果其他单词包含下划线,可能会有点风险。实际上,我需要进行匹配,就像没有换行符一样。你知道我会怎么做吗?你必须对你要找的东西更具体一点,但可能是像/[a-Z]+Z]+/这样的东西,它捕获每个只有一个下划线的大写单词?