正则表达式

简述

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen,查询字符串时可能需要满足某些复杂规则,这时就可以使用正则表达式来定义这些复制规则,。

基础语法

  1. 单个字符(数量:1)
    • 字符:表示由一位字符所组成
    • \:表示转义字符”“
    • :表示一个制表符符号
    • :匹配换行( )符号
  2. 字符集(数量:1)
    • [abc]:表示可能是字符a或是字符b或是字符c中的任意一位
    • [^abc]:表示不是字符a或是字符b或是字符c中的任意一位
    • [a-z]:所有的小写字母
    • [a-zA-Z]:字母中的任意一位
    • [A-Z]:所有的大写字母
    • [0-9]:表示任意一位数字(只有一位,则范围为0到9)
  3. 简化的字符集表达式(数量:1)
    • . :表示任意的一位字符
    • d:等价于"[0-9]",属于简化写法,需要转义
    • D:等价于"[^0-9]"
    • s:表示任意的空白字符,例如:" "," "
    • S:表示任意的非空白字符
    • w:等价于"[a-zA-Z_0-9]",表示由任意的字母、数字、_ 所组成
    • W:等价于"[^a-zA-Z_0-9]",表示不是由任意的字母、数字、_ 所组成
  4. 边界匹配(不要在java使用,在javaScript使用)
    • ^:正则的开始
    • $:正则的结束
  5. 数量表达
    • 正则表达式?:表示可以出现0次或1次
    • 正则表达式+:表示出现1次或1次以上
    • 正则表达式*:表示可以出现0次或1次或多次
    • 正则表达式{n}:表示此正则正好出现n此
    • 正则表达式{n,}:表示此正则出现n此以上(包含n次)
    • 正则表达式{n,m}:表示次正则出现n到m次(包含n次和包含m次)
  6. 逻辑运算
    • 正则表达式1正则表达式2:正则1判断完之后继续判断正则2
    • 正则1|正则2:正则1或正则2有一组满足即可
    • (正则):将多个正则作为一组,可以为这一组单独设置出现的次数

速记理解技巧

.
[ ]
^
$
四个字符是所有语言都支持的正则表达式,所以这四个是基础的正则表达式。正则难理解因为里面有一个等价的概念,这个概念大大增加了理解难度,让很多初学者看起来会懵,如果把等价都恢复成原始写法,自己书写正则就超级简单了,就像说话一样去写你的正则了:

  等价:
等价是等同于的意思,表示同样的功能,用不同符号来书写。
?,*,+,d,w 都是等价字符
  ?等价于匹配长度{0,1}
  *等价于匹配长度{0,}
  +等价于匹配长度{1,}
  d等价于[0-9]
D等价于[^0-9]
  w等价于[A-Za-z_0-9]
W等价于[^A-Za-z_0-9]。
常用运算符与表达式:
  ^ 开始
  () 域段
  [] 包含,默认是一个字符长度
  [^] 不包含,默认是一个字符长度
  {n,m} 匹配长度
  . 任何单个字符(. 字符点)
  | 或
   转义
  $ 结尾
  [A-Z] 26个大写字母
  [a-z] 26个小写字母
  [0-9] 0至9数字
[A-Za-z0-9] 26个大写字母、26个小写字母和0至9数字
  , 分割
  .
  
  分割语法:
  [A,H,T,W] 包含A或H或T或W字母
  [a,h,t,w] 包含a或h或t或w字母
  [0,3,6,8] 包含0或3或6或8数字

  语法与释义:
  基础语法 "^([]{})([]{})([]{})$"
  正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束"
  
  ?,*,+,d,w 这些都是简写的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)这种特殊组合情况下除外。
  初学者可以忽略?,*,+,d,w一些简写标示符,学会了基础使用再按表自己去等价替换

  
  实例:
  字符串;tel:086-0666-88810009999
  原始正则:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"
  速记理解:开始 "tel:普通文本"[0-9数字]{1至3位}"-普通文本"[0数字][0-9数字]{2至3位}"-普通文本"[0-9数字]{8至11位} 结束"
  等价简写后正则写法:"^tel:d{1,3}-[0]d{2,3}-d{8,11}$" ,简写语法不是所有语言都支持。

Java对正则表达式的支持

正则从JDK1.4引入的工具类,所有正则支持的类都在java.util.regex包中

java.util.regex主要有两个类:

  • Pattern:此类对象如果要想取得必须使用compile()方法,功能是编译正则;
  • Matcher:通过Pattern类的实例对象取得:matcher()

例子:Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。

String类对正则表达式的支持

String类也可以对正则的操作,String中关于正则的方法:

  • public boolean matches(String regex):正则验证,使用指定的字符串判断其是否符合给出的正则表达式结构
  • public String replaceAll(String regex,String replacement):根据正则表达式匹配的字符串全部替换
  • public String replaceFirst(String regex, String replacement):根据正则表达式匹配的字符串替换首个
  • public String[] split(String regex):根据正则表达式匹配的字符串全部拆分
  • public String[] split(String regex, int limit):根据正则表达式匹配的字符串部分拆分
原文地址:https://www.cnblogs.com/TangMingJie/p/12283598.html