zoukankan      html  css  js  c++  java
  • 正则表达式指北

    正则表达式(regular expression)提供了一种字符串匹配模式,在定义了一系列“通配符”的情况下,方便我们查找给定文本串下的满足某些特定条件的子串。

    一般而言,我们用bbs去匹配bsbsbbs,得到的就是匹配到最后三位的结果。但假设我忘记了最后一位是什么,只记得前两位是bb该怎么办,利用正则表达式就能解决此类问题。

    字符类

    这一类的符号限制匹配的字符种类。

    • .可以用来匹配任何一个字符,如bb.可以用来匹配bbs或者bbq或者bb2.

    • []表示匹配括号内的任何一个字符,如[abc]bc能同时匹配到abc,bbc,cbc,但是不能匹配到dbc.

    • -表示范围,如[abc]bc等价于[a-c]bc.

    • ^表示“非”,在[]的开头使用,表示匹配除括号内的字符以外的任何字符,如[^abc]bc[^a-c]bc能匹配到dbc,2bc, bc,不能匹配到abc,bbc,cbc.

    注意,对于在正则表达式有特殊意义的字符,如果我们需要在文本串中匹配这个字符,则需在正则表达式中的该字符前加上,比如为了匹配0.1的正则表达式需要写成[0-9].[0-9]

    数量类

    这一类的字符对字符的出现次数进行限制。

    • ?表示前面的字符的出现次数(leq 1),如a?bc能匹配到abcbc,不能匹配到aabc

    • +表示前面的字符的出现次数(geq 1),如a+bc能匹配到abcaabc,不能匹配到bc

    • *表示前面的字符的出现次数(geq 0),如如a?bc能匹配到abc,bcaabc

    • {n,m}表示前面字符的出现次数在区间([n,m])中。注意,如果没有(n)或者没有(m)则表示前面字符的出现次数没有下界/上界限制。如果大括号内只有一个数{n}则表示前面字符的出现次数应恰好(n)次。

    有了上面的两类表达式已经可以解决一些简单的匹配问题了。

    • 匹配一个三位数:[1-9][0-9]{2}(但其实这个会对那些长度(>3)的数进行一个分段操作,所以并不是完美的。)

    • 匹配无前导0的数:[1-9][0-9]*

    • 匹配C语言的标识符:[a-zA-Z_]+[a_zA-Z0-9_]*

    • 匹配邮箱地址:[a-zA-z0-9_.-]+@[a-zA-z0-9_.-]+.[a-zA-z0-9_.-]+(这里的中括号中的_.-表示的就是这三个字符,只有当它们位于括号外面且需要匹配其本身时才需要加上转义符

    位置类

    这一类字符对匹配的字符或串出现的位置进行限制。

    • ^:匹配行首的位置。

    • $:匹配行尾的位置。

    • <:匹配单词开头的位置。如<t能匹配the,但不能匹配cat

    • >:匹配单词结尾的位置。如t>能匹配cat,但不能匹配the

    • :匹配单词开头或结尾的位置,如at能匹配at,但不能匹配cat,atekate

    • B:匹配不是单词开头或结尾的位置,如BatB能匹配kate,但不能匹配cat,ateat

    其它类

    记录一下其它的字符

    • ():将括号内的东西视为整体,可对这个整体进行数量类限制。

    • |:连接两个字符串,表示匹配时的或者关系。

    • d,D:表示数字/非数字字符。

    • w,W:表示(不是)数字字母下划线字符。

    • s,S:表示(不是)空白区域。

    Tips(不断更新)

    • 利用正则表达式进行替代时可以用$1,$2,(cdots)来替代查找中进行省略查找的部分。

    • 一般来说使用*.等符号进行查找时会尽量多的匹配文本串(贪婪模式),可以通过加上?来使得尽量少的匹配(非贪婪模式,一旦发现能匹配成功就停止匹配)

    例如对于文本串:acacacb

    如果使用a.*c进行查找,得到的串就是acacac

    如果使用a.*?c进行查找,得到的串就是ac

  • 相关阅读:
    线程中消费者生产者的实例代码(synchronized关键字)
    ThreadLocal管理Connection
    ThreadLocal的练习代码
    JDK中线程组ThreadGroup
    创建线程的三种方式
    ES练习代码
    window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
    ES配置文件中文版
    springmvc工作原理
    IE不兼容document.getElementsByClassName
  • 原文地址:https://www.cnblogs.com/encodetalker/p/15313175.html
Copyright © 2011-2022 走看看