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

nop*_*ole 20 regex modifiers

我经常忘了正则表达式修饰符ms与他们之间的分歧.什么是记住它们的好方法?

据我了解,他们是:

"m"是用于多线,以便^$ 将匹配字符串和字符串多次的结束的开始.(除以\n)

's'是这样的,即使是换行符,点也会匹配

通常,我只是使用

/some_pattern/ism
Run Code Online (Sandbox Code Playgroud)

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

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

Ala*_*ore 20

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

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

至于总是使用/ism,我建议反对它.正如你所发现的那样,它几乎是无害的,但是它向其他试图弄清楚正则表达式应该做什么的人(或者甚至将来自己)发出一个令人困惑的信息.


Jim*_*imG 10

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

款待字符串作为 ultiple线.
小号 款待字符串作为š英格尔线.

使用多行,^和$适用于各行(即在换行之前和之后).
使用单行,^和$适用于整体,\n只是成为您可以匹配的另一个角色.

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

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