首页 > 编程语言 > 详细

各编程语言正则库的小差别

时间:2018-07-14 21:54:26      阅读:177      评论:0      收藏:0      [点我收藏+]

个人笔记,不保证正确。
待完善。。

日常工作中能接触到的正则,分为两大派别,其中类 Unix 系统中常用的正则,属于 POSIX “派”(较弱),而各编程语言标准库中的 Re,基本都是 PCRE “派”。(详见 正则表达式“派别”简述

可虽然说各编程语言基本都属于 PCRE 派,实现上却还是各有特点,一个正则想在各语言间移植,也往往需要一番修改。

今天学 Elixir,就在正则上遇到了问题,百度一番,想想索性就把这些差别总结一遍,防止下次又掉坑里。(包括 Python、Java、Elixir、文本编辑器的正则,有时间把 SQL 的正则也写写。。)

一、正则库方法上的差别

1.1 模式匹配

  1. 文本编辑器的正则是用来搜索的,会匹配整段文本中所有符合该模式的字符串,可以叫做 find all
  2. 而不同的编程语言,又要看方法设计上的理念差别:
    • Python 提供了 match(只要求从字符串开头的一部分文本能匹配)、fullmatch(要求匹配整个字符串)、search(从字符串中搜索该模式,找到第一个就停止)、findall(这个就对应 editor 的匹配模式,会返回字符串中所有匹配该模式的子字符串)

1.2 字符串替换

  1. 文本编辑器在替换字符串中,使用 $1 $2 等来表示前面捕获的数字分组。

二、正则书写上的差别

  1. Python 有 raw 字符串,Elixir 也有对应的 sigils,在这种字符串里,正则不需要用一大堆反斜线(slash)来转义,而 Java 就不得不如此。
  2. Elixir 的 sigils 引用符有 8 种,Python 的字符串引用符也有两种(单引号和双引号),可以通过灵活地换用它们来进一步避免使用转义符。而 Java 还是没有。。
  3. 匹配 flags 的指定方式:
    • Elixir:写在引用符的最后,eg. ~r/your regex/ss 表示 dot matches all。

待续

其他需要注意的

  1. . 默认是匹配除非换行外的任何字符。如果需要包括换行,需要开启dot matchs all 选项,或者使用大小写匹配符结合(如 [\s\S] [\w\W] 之类)
  2. 所有重复限定符(* + ? {m,n}),默认都是贪婪匹配,如果需要懒惰匹配,要在后面多加个?,变成 *? +? {m,n}?
  • 懒惰匹配:
    正则匹配默认都是贪婪模式,懒惰匹配要在重复限定符后多加一个?,表示匹配尽可能少的字符。比如.*要改成.*?

参考

各编程语言正则库的小差别

原文:https://www.cnblogs.com/kirito-c/p/9310908.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!