正则表达式语法

一个正则表达式描述了字符串的构成规则(模式)。如果一个具体的字符串正好符合正则表达式描述的这个规则,这个字符串就是与表达式匹配的。先看一下怎么描述这种规则,也就是正则表达式语法。正则表达式类似于前面文章中的glob模式,但更加复杂和强大。

此处只列出常用的语法,更复杂的可以查正则表达式的详细资料。

正则表达式的构成元素:

  • 字符

    • 普通字符             与该字符自身匹配
    • \unnnn\xnn  \0n   \0nn  \0nnn        十六进制或十进制码元代表的字符
    • \t  \n  \r  \f  \a  \e       控制字符:制表符,换行符,回车符,换页符,警告符,逃逸符
    • \cc          与字符c相关的控制符
  • 字符类  
    • [c1c2c3...]        任何由ci表示的字符。 Ci可以是多个字符,或字符范围a-z A-Z 0-9,或其他字符类,(包含-字符本身时必须是第一项或最后一项,包含[字符时必须是第一项,包含^字符时不能作为第一项,只需要转义\和])。
    • [^...]       字符集的补集
    • [...&&...]     两个字符集的交集
  • 预定义字符类
    • .         除了行终止符之外的所有字符(DOTALL标识被设置时,表示包括行终止符在内的所有字符)
    • \d     数字,等效于[0-9]
    • \D     非数字,等效于[^0-9]
    • \s      空白字符,等效于[ \t\n\r\f\x0B]
    • \S     非空白字符
    • \w     词语字符,等效于[a-zA-Z0-9]
    • \W    非词语字符
    • \p{name}     命名字符类,name有以下值
      • Lower    ASCII小写字母[a-z]
      • Upper   ASCII大写字母[A-Z]
      • Alpha    ASCII字母[a-zA-Z]
      • Digit     ASCII数字[0-9]
      • Alnum   ASCII字母或数字[0-9a-zA-Z]
      • XDight   十六进制数字
      • Print|Graph  ASCII可打印字符[\x21-\x7E]
      • Punct    标点,即可打印的非字母非数字符号[\p{print}&&\P{Alnum}]
      • ASCII   所有ASCII[\x00-\x7F]
      • Cntrl   ASCII控制字符[\x00-\x1F]
      • Blank   空格字符或制表位[ \t]
      • Space   空白字符[ \t\n\r\f\0x0B]
      • javaLowerCase    Character.isLowerCase()确定的字符
      • javaUpperCase    Character.isUpperCase()确定的字符
      • javaWhiteSpace   Character.isWhitespace()确定的字符
      • javaMirrored    Character.isMirrored()确定的字符
      • Inxxxx    Unicode某个字符块中字符,xxxx是剔除空格后的字符块的名字,如Arrows, Latin1Supplement
      • Isxxxx    Unicode某个脚本字符,xxxx是剔除空格后的脚本名称,如Common
      • yyyy|Inyyyy    Unicode某个类别中字符,yyyy是类别名字,如L:字母,Sc:货币符号
      • Iszzzz     Unicode某个属性的字符(Alphabetic, Ideographic, Letter, LowerCase, Uppercase, Titlecase, Punctuation, Control, White_space,Digit, Hex_Digit, Noncharater_Code_point, Assigned)
    • \P{name}     命名字符类的补集
  • 边界匹配字符
    • ^   $      输入的开头和结尾,如果设置多行模式则为行的开头和结尾
    • \b      词的边界
    • \B     非词的边界
    • \A     输入开头
    • \z      输入的结尾
    • \Z     除了行终止符之外的输入结尾
    • \G     前一个匹配的结尾
  • 量词
    • X?     X可出现0次或1次(有没有都行)
    • X*     X可以出现0到无限次
    • X+     X可以出现1到无限次
    • X{n}   X{n,}   X{n,m}    X必须出现n次,n到无限次,n到m次
  • 量词后缀
    • ?       将默认匹配转变为勉强匹配。
    • +      将默认匹配转变为占有匹配
  • 集合操作
    • XY    X的匹配后跟着Y的匹配
    • X|Y   任何X或Y的匹配
  • 群组
    • (X)    将X子表达式定义为群组,捕获群组匹配的字符串,群组的编号基于1,按左括号的顺序算,群组0代表匹配的所有字符
    • \n      反向引用第i个群组捕获的字符串。
  • 转义和其他
    • \
    • \Q...\E   逐字地引用...
    • (?...)    特殊结构

量词的匹配模式

  • 默认模式:可匹配成功的最多重复次数;      [a-z]*b+ => caabb
  • ? 勉强匹配:匹配最小的重复次数;              [a-z]*?b+ => caabb
  • + 占用/贪婪匹配:匹配最大重复次数,即使后续的匹配会失败。    [a-z]*+b+ => caabb   b+匹配失败

Java中使用正则表达式

正则表达式用到Pattern,Matcher等类,String等类中也有方法可以快捷的使用正则表达式。正则表达式的字符串输入参数类型为CharSequence接口(CharArray, CharBuffer, String, StringBuffer, StringBuilder)

  Pattern

    • static Pattern compile(String regex)
    • static Pattern compile(String regex, int flags)    多个flags为相加,如Pattern.compile(regexStr, Pattern.DOTALL+Pattern.MULTILINE)。常用标识如下

      • CASE_INSENSITIVE    忽略大小写
      • UNICODE_CASE   与 CASE_INSENSITIVE组合时,使用Unicode字母的大小写匹配
      • MULTILINE     ^,$匹配行的开头和结尾而不是整个输入的开头和结尾
      • UNIX_LINES    多行模式时,行终止符为\n
      • DOTALL      '.'符合匹配所有字符,包括行终止符
      • CANON_EQ    考虑Unicode字符规范的等价性,不懂。。。
    • static String quote(String s)     预处理正则表达式字符串,取消所有特殊字符的意义并按普通字符匹配,返回处理后的表达式,(加\Q\E)
    • String pattern()/toString()
    • int flags()   返回模式匹配标识
    • Matcher matcher(CharSequence input)    创建一个可以处理匹配的Matcher类
    • static boolean matches(String regex, CharSequence input)     返回整个input字符串是否和regex匹配
    • String[]  split(CharSequence input, int limit)     以满足this正则表达式的字符串为分隔字符将输入字符串切分,  limit表示需要切成几段(要切成n段,只需要切n-1次),limit为0表示全切,为1实际上不会切。
    • String[]  spilt(CharSequence input)

  Matcher

    • boolean matches()    输入字符串是否和Pattern正则表达式匹配整体匹配
    • boolean lookingAt()  输入字符串的开头部分是否匹配
    • boolean find()    尝试查找下一个匹配,如果找到了另一个匹配返回true,否则返回false。查找成功后,使用start,end,group等方法获取匹配信息。
    • boolean find(int start)  从字符串指定的偏移位置处开始查找下一个匹配
    • int start()    当前匹配的开始索引位置
    • int end()    当前匹配的结尾的后一个索引位置
    • String group()  返回当前匹配的子字符串, 等价group(0)
    • int groupCount()  返回群组的数量,(不算群组0,,即整个匹配字符串)
    • int start(int groupIdx)  返回某个群组的开始位置
    • int end(int groupIdx)    返回某个群组结尾的后一个索引位置
    • String group(int groupIdx)  返回某个群组捕获的字符串
    • String group(String name)    返回命名群组捕获的字符串
    • String replaceAll(String replacement)    replacement中可以包含$n表示对群组的引用,\$表示$字符
    • String replaceFirst(String replacement)
    • static String quoteReplacement(String s)   预处理替代字符串(\\和$前面添加\\),使特殊字符按普通字符匹配
    • Matcher reset()    复位状态,可以重头在查找匹配
    • Matcher reset(CharSequence input)   切换输入字符串并复位状态
    • Matcher usePattern(Pattern newPattern)   切换模式
    • Matcher appendReplacement(StringBuffer sb, String replacement)   这两个appendxxx方法组合使用,替换时结果直接存入StringBuffer中
    • StringBuffer appendTail(StringBuffer sb)

 

    String   类中也提供了支持使用正则表达式的便捷方法

    • boolean matches(String regex)
    • String replaceFirst(String regex, String replacement)
    • String replaceAll(String regex, String replacement)
    • String[] split(String regex, int limit)
    • String[] split(String regex)
        String patternString="((\\d{1,2}):(\\d{1,2}))+";
String inputString="start 12:43, end 05:43";
Pattern pattern=Pattern.compile(patternString);
Matcher matcher=pattern.matcher(inputString);
System.out.println("total match: "+matcher.matches());
int c=;
while(matcher.find())
{
System.out.println("match "+(++c)+": "+matcher.group());
for(int i=; i<=matcher.groupCount();i++)
System.out.println("\tgroup "+i+": "+matcher.group(i));
}
     Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());

《Java核心技术卷二》笔记(三)正则表达式的更多相关文章

  1. Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar

    正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...

  2. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  3. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  4. java核心技术学习笔记之一程序设计概述

    Java 核心技术之一程序设计概述 一.   Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向 ...

  5. java中的自动拆装箱与缓存(Java核心技术阅读笔记)

    最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...

  6. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  7. 《Java核心技术卷二》笔记(二)文件操作和内存映射文件

    文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...

  8. 《Java核心技术卷二》笔记(一)流与文件

    一.流的概念 在Java中,可以提供字节序列的对象,或者可以接收字节序列的对象,都可以抽象成流.系统中的文件,网络,内存这些设备都可以读入或者写入字节,自然也可以用流的方式来操作.能向程序中提供字节序 ...

  9. Java核心技术卷二部分笔记

    第1章 流与文件 1.2 文本输入与输出 第3章 网络 3.3 可中断套接字 第4章 数据库编程 4.5.2 读写LOB 4.6 可滚动和可更新的结果集 4.8 元数据 第6章 高级Swing 6.1 ...

随机推荐

  1. 寻找代表元(codevs 2776)

    题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用1到n编号.广州二中苏元实验学校一共有m个人,分别用1到m编号.每个人可以参加一个或多个社团,也可以不参加任何社团.每个社团 ...

  2. yum_rpm(利用dvd建立本地yum库)

    #wget "http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os" 建立起了index.html ...

  3. eclipse 和 android studio 快捷键对比

    操作 studio eclipse   debug/run 计算变量值 alt+F8 ctrl+shift+I 跳到下一步 F8 F6 跳到下一个断点 shift+F8 F8 进入到代码 F7 F5 ...

  4. php封装练习

    <body> <?php class jisuan { private $a; private $b; function __construct($a,$b) { $this-> ...

  5. .net学习笔记---HttpResponse类

      HttpReponse是服务器接收到浏览器的请求后,处理返回结果常用的一个类. 一.属性 Buffer 获取或设置一个值,该值指示是否缓冲输出并在处理完整个响应之后发送它. BufferOutpu ...

  6. HTML CSS简单总结

    1.css 的border属性改变hr颜色小示例 <hr style="border:0;background-color:#ff0000;height:1px;margin:0;pa ...

  7. OpenStack Keystone安装部署流程

    之前介绍了OpenStack Swift的安装部署,采用的都是tempauth认证模式,今天就来介绍一个新的组件,名为Keystone. 1. 简介 本文将详细描述Keystone的安装部署流程,并给 ...

  8. javascript集合的交,并,补,子集的操作实现

    可能新的ECMA规范里已有了这些的实现, 但能自己从头开始实现,感觉也非常不错的哟... function Set() { var items = {}; this.has = function(va ...

  9. SAE上传web应用(包括使用数据库)教程详解及问题解惑

    转自:http://blog.csdn.net/baiyuliang2013/article/details/24725995 SAE上传web应用(包括使用数据库)教程详解及问题解惑: 最近由于工作 ...

  10. Python 中的函数与类的方法

    注:本文转译自 Stackoverflow 上 Adding a Method to an Existing Object 的最佳回答. 在 python 中,def 定义的函数与类中的方法有很大的不 ...