(?m:\ s *)在正则表达式中的含义是什么?

时间:2012-09-04 14:11:26

标签: ruby regex

这对表达式意味着什么?

(?m:.*?)

或者

(?m:\s*)

我的意思是,它似乎与空白有关,但我不确定。

其他细节:
我正在看的完整表达是:

\A((?m:\s*)((\/\*(?m:.*?)\*\/)|(\#\#\# (?m:.*?)\#\#\#)|(\/\/ .* \n?)+|(\# .* \n?)+))+

2 个答案:

答案 0 :(得分:0)

模式.*?将匹配任何字符串,但作为短字符串匹配,因为存在惰性运算符?

模式\s*将匹配空格字符(零以上)。

(?m)启用“多线模式”。在此模式下,插入符号和美元在主题字符串中的换行符之前和之后匹配。要仅将此模式应用于某个子模式,请使用sytax (?m:...),其中...是匹配模式。

有关详细信息,请参阅http://www.regular-expressions.info/modifiers.html

答案 1 :(得分:0)

(?...)是一种将修饰符应用于括号内的正则表达式的方法。

(?:...)允许您将括号之间的部分视为一个组,而不会影响匹配引擎捕获的字符串集。但是您可以在?:之间添加选项字母,在这种情况下,括号之间正则表达式的部分就像在创建正则表达式时包含这些选项字母一样。也就是说,/(?m:...)/的行为与/.../m相同。

m反过来启用“多线”模式。

<强> CORRECTED:

这是我在原始答案中感到困惑的地方,因为这个选项在不同的环境中有不同的含义。

此问题标记为Ruby,其中“多行模式”使点字符(.)与新行匹配,而通常这是一个不匹配的字符:

irb(main):001:0> "a\nb" =~ /a.b/
=> nil
irb(main):002:0> "a\nb" =~ /a.b/m
=> 0
irb(main):003:0> "a\nb" =~ /(?m:a.b)/
=> 0

因此,您的第一个正则表达式(?m:.*?)将匹配任何字符(包括换行符)的任意数字(包括零)。基本上,它将匹配任何东西,包括任何东西。

在第二个正则表达式(?m:\s*)中,修饰符完全没有效果,因为包含的表达式中没有要修改的点。

回到第一个表达式。正如Ωmega所说,?之后的*意味着它是一种非贪婪的匹配。如果这是整个表达,或者如果没有捕获,那就没关系了。但是当某个部分跟随该部分并且有捕获时,您会得到不同的结果。没有?,最长的匹配胜利:

irb(main):001:0> /<(.*)>/.match("<a><b>")[1]
=> "a><b"

使用?,您将得到最短的一个:

irb(main):002:0> /<(.*?)>/.match("<a><b>")[1]
=> "a"

最后,关于上述/m混淆(尽管如果你想避免自己混淆,这可能是一个停止阅读的好地方):

在Perl 5中(除了基本语法之外的大多数正则表达式扩展的源代码),由/m在Ruby中触发的行为由/s选项触发(Ruby不会虽然如果你把一个放在你的正则表达式上它会默默地忽略它)。在Perl中,/m尽管仍称为“多线模式”,但效果完全不同:它会导致^$锚点在字符串内的换行符处以及分别是整个字符串的开头和结尾。但在Ruby中,这种行为是默认行为,甚至没有改变它的选项。