这在表达式中意味着什么?
(?m:.*?)
或这个
(?m:\s*)
我的意思是,它似乎与空白有关,但我不确定。
附加细节:
我正在查看的完整表达式是:
\A((?m:\s*)((\/\*(?m:.*?)\*\/)|(\#\#\# (?m:.*?)\#\#\#)|(\/\/ .* \n?)+|(\# .* \n?)+))+
模式.*?
将匹配任何字符串,但字符串尽可能短,因为有一个惰性运算符?
。
模式\s*
将匹配空白字符(零个或多个)。
(?m)
启用“多行模式”。在这种模式下,插入符号和美元在主题字符串中的换行符之前和之后匹配。要将此模式仅应用于某些子模式,请(?m:...)
使用 sytax,其中...
是匹配模式。
有关更多信息,请阅读http://www.regular-expressions.info/modifiers.html
(?...)
是一种对括号内的正则表达式应用修饰符的方法。
(?:...)
允许您将括号之间的部分视为一个组,而不会影响匹配引擎捕获的字符串集。?
但是您可以在和之间添加选项字母:
,在这种情况下,括号之间的正则表达式部分的行为就像您在创建正则表达式时包含了这些选项字母一样。也就是说,/(?m:...)/
行为与 相同/.../m
。
反过来m
,启用“多行”模式。
更正:
这是我在原始答案中感到困惑的地方,因为此选项在不同的环境中具有不同的含义。
这个问题被标记为 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 中,这种行为是默认行为,甚至没有选项可以更改它。