regex - 正则表达式修饰符(或标志) 'm' 和 's' 之间的区别?

标签 regex modifier

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

据我了解,它们是:

'm' is for multiline, so that ^ and $ will match beginning of string and end of string multiple times. (as divided by \n)

's' is so that the dot will match even the newline character

通常,我只是使用

/some_pattern/ism

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

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

最佳答案

使用正则表达式多年但仍然不了解这两个修饰符如何工作的人并不罕见。正如您所观察到的,名称“多行”和“单行”并不是很有帮助。它们听起来好像必须是相互排斥的,但实际上它们是完全独立的。我建议您忽略这些名称并专注于它们的作用:m 更改 anchor 的行为(^$),并且 s 更改点 (.) 的行为。

Ruby 的作者是一位混淆了这些模式的杰出人物。他基于 Perl 创建了自己的正则表达式实现,但他决定让 ^$ 始终为行 anchor ——也就是说,多行模式始终处于打开状态。不幸的是,他还错误地将点匹配一切模式命名为多行。因此,Ruby 没有 s 修饰符,但它的 m 修饰符可以实现 s 在其他风格中的作用。

至于总是使用/ism,我建议不要这样做。正如您所发现的,它基本上是无害的,但它向任何试图弄清楚正则表达式应该做什么的其他人(甚至将来的您自己)发送了一条令人困惑的信息。

关于regex - 正则表达式修饰符(或标志) 'm' 和 's' 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/918806/

相关文章:

sql - 用于提取 SQL where 子句的正则表达式

java - add/*package*/in package 私有(private)类

python - 使用 matplotlib 键事件和修饰符

c++ - 为什么我应该在 scanf() 系列成员中加入一个长度修饰符作为参数?有什么好处?带有长度修饰符的 scanf 有什么作用?

java - 导致异常的构造函数的 void 修饰符

c# - 字符串和最后一位数字之间的正则表达式匹配

php - 在 PHP 中具有动态正则表达式的类似主干的路由器

Java 不会因双逗号而崩溃 "malformed line"

regex - 正则表达式和换行符中的美元符号

java - 如何确定 Eclipse JDT 中方法或字段的修饰符?