正则表达式修饰符'm'和's'之间的区别?

时间:2009-05-28 01:35:14

标签: regex modifiers

我经常忘记正则表达式修饰符ms及其差异。什么是记住它们的好方法?

据我所知,他们是:

  

'm'用于多行,因此^$   将匹配字符串的开头和结束   字符串多次。 (分开   \n

     

's'使得点匹配均匀   换行符

通常,我只是使用

/some_pattern/ism

但是相应地使用它们可能更好(在我的情况下通常是“s”)。

你认为什么是记住它们的好方法,而不是忘记每次哪一个?

3 个答案:

答案 0 :(得分:19)

多年来一直在使用正则表达式的人仍然不明白这两个修饰符是如何工作的并不罕见。正如您所观察到的,“多行”和“单行”这两个名称并不是很有用。他们听起来必须互相排斥,但他们完全独立。我建议你忽略名称并专注于他们的行为:m改变锚点的行为(^$),s改变点的行为(.)。

混合模式的一个突出人物是Ruby的作者。他创建了自己的基于Perl的正则表达式实现,除了他决定让^$始终是行锚 - 也就是说,多行模式始终打开。不幸的是,他也错误地命名了dot-matches-everything模式 multiline 。所以Ruby没有s修饰符,但它的m修饰符可以完成s在其他方面的作用。

至于始终使用/ism,我建议不要使用它。正如你所发现的那样,它几乎是无害的,但是它会给那些试图弄清楚正则表达式应该做什么的人(或者甚至是将来的自己)发出一个令人困惑的信息。

答案 1 :(得分:10)

我喜欢'man perlre'中的解释:

m 将字符串视为 m 多行 s 将字符串视为 s 单行。

使用多行,^和$适用于各行(即新行之前和之后) 使用单行,^和$适用于整体,\ n只是成为另一个可以匹配的字符。

[错误] 通过使用你所描述的m和s,我希望第二个优先,所以你总是处于多线模式,使用/ism. [/错]

我读的不够多:
“/ s”和“/ m”修饰符都覆盖$ *设置。也就是说,无论$ *包含什么,没有“/ m”的“/ s”将强制“^”仅在字符串的开头匹配,而“$”仅在结尾处(或在新行之前)字符串的结尾)。和/ ms一起,他们让“。”匹配任何字符,同时仍允许“^”和“$”分别匹配字符串中的换行符之后和之前。

答案 2 :(得分:1)

也许这样,我永远不会忘记:

当我想跨越线时(通常使用。*?来匹配跨越多行无关紧要的东西),我自然会想到多线,因此,'m'。好吧,'我'实际上不是那个,所以它是's'。

(因为我已经记得'ism'那么好......所以我总能记住它不是'我',那它一定是's'。)

其他蹩脚的尝试包括:

s用于DOTALL,DOT匹配ALL m是多行的 - ^$匹配很多次。