美文网首页
5.2 单行模式

5.2 单行模式

作者: 马小跳_ | 来源:发表于2018-12-07 20:33 被阅读2次

元字符.几乎能匹配任何字符,除了换行符\n但是有时候确实需要匹配“任何字符”,比如在处理HTML源代码时,经常会遇到跨越多行的脚本代码:

<script type="text/javascript">
    ....
    ....
</script>

因为这段js代码中出现了换行符,所以.*的匹配最多只能进行到第一行末尾。之前提到过,可以用类似[\s\S]的字符组匹配“任意字符”,所以正则表达式<script\s[\s\S]*?</script>能解决问题。

不过对大多数人来说,点号更加自然,也更简洁,所以正则表达式提供了单行模式。在这种模式下,所有文本似乎只在一行里,换行符是这一行中的“普通字符”,可以由元字符.匹配。

单行模式对应的模式修饰符是s(Single line),所以如果用模式修饰符,可以在表达式的开头用(?s)指定,因此上面的表达式也可以改为(?s)<script\s.*?</script>,效果是一样的。

表5-3 常用语言中单行模式的预定义常量

语言 常量
.NET RegexOptions.Singleline
JAVA Pattern.DOTALL
JavaScript 不支持
PHP /regex/s
Python re.S
re.DOTALL
Ruby /regex/m
Regex::MULTILINE

单行模式在不同语言中的称呼很不一样,甚至在同一门语言中也可能有不同的记法(比如python)。

比如在java和python中叫做DOTALL(点号通配),这个名字确实更高明(因为常用模式中还包含“多行模式”,它和“单行模式”没什么关系,但是这两个名字确实很迷惑人)。但是“单行模式”是约定俗成的称呼。

比较奇怪的是ruby的预定义常量Multiline是“多行”的意思,它的模式修饰符也是“m”。这确实让人费解,或许本意是“使用点号.的正则表达式可以跨越多行”?不管怎样,一定要记住,Ruby中的“多行模式”实际上说的是“单行模式”

相关文章

  • 5.2 单行模式

    元字符.几乎能匹配任何字符,除了换行符\n。但是有时候确实需要匹配“任何字符”,比如在处理HTML源代码时,经常会...

  • Python基础(5)-注释

    5.1-单行注释: 单行注释只需要在代码前面加上 # 号 5.2-多行注释: 多行注释只需要用三个单引号或者三个双...

  • 5.3 多行模式

    “多行模式”听起来是与“单行模式”对应的,其实这两个模式没有任何联系。 单行模式影响的是点号的匹配规则:在默认模式...

  • 存储过程初识

    一、注释 单行注释 多行注释 二、删除 三、新建 四、 打印日志 五、调用存储过程 5.1调用 5.2结果 设置显...

  • Android中的设计模式之命令模式

    参考 《设计模式:可复用面向对象软件的基础 》5.2 Command 命令 对象行为型模式 《Android源码设...

  • 正则表达式在iOS项目的应用

    iOS正规表达式NSRegularExpression支持单行模式和多行模式、支持非贪婪模式 Xcode支持正则查...

  • javascirpt基础语法解读

    注释 单行 多行 严格模式 use stricthttps://developer.mozilla.org/zh-...

  • 基础-17、vim(一)

    笔记内容:5.1 vim介绍5.2 vim颜色显示和移动光标5.3 vim一般模式下移动光标5.4 vim一般模式...

  • VIM工具(一)

    摘要:5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 ...

  • manjaro gnome lysia 配置 fcitx5

    安装 配置 编辑 ~/.config/fcitx5/config 编辑~/.xprofile 使用单行模式(inl...

网友评论

      本文标题:5.2 单行模式

      本文链接:https://www.haomeiwen.com/subject/pfvxhqtx.html