正则表达式语法

一个正则表达式描述了字符串的构成规则(模式)。如果一个具体的字符串正好符合正则表达式描述的这个规则,这个字符串就是与表达式匹配的。先看一下怎么描述这种规则,也就是正则表达式语法。正则表达式类似于前面文章中的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. 谈Web前端安全编码

    最近开发中涉及到有关输出正确的HTML标签这样的问题,正好对字符编码这块儿多看看,之前对这个方面认识的不深,思考的确实不够,如果下次再碰见类似的问题,若再次不少时间去调研的花,就得不偿失了. 就像正则 ...

  2. Java Hour 12 Generic

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为12 Hour,请各位不吝赐教. 泛型程序设计 为 ...

  3. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)C. Bear and Poker

                                                  C. Bear and Poker                                     ...

  4. poj 1463(树形dp)

    题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...

  5. CodeForces 505B Mr. Kitayuta's Colorful Graph

    Mr. Kitayuta's Colorful Graph Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  6. 万网云解析设置二级域名解析到同IP不同端口

    http://jingyan.baidu.com/article/eb9f7b6d8a02a5869364e827.html

  7. mysql之对表的操作

    1. 表的基本概念 在数据库中,表是一种非常重要的数据库对象,是组成数据库的基本对象,由若干个字段组成,主要用来储存数据记录. 表中的数据库对象包含列,索引和触发器. 列:也称属性列,在具体创建表时必 ...

  8. wp7 HubTile

    在最新的Windows Phone Toolkit中我们可以看到HubTile这个控件,首先先了解下什么是HubTile,简单来说,就是允许你给你的应用程序添加些生动或富有意义的瓦片(Tile).Hu ...

  9. COJ976 WZJ的数据结构(负二十四)

    试题描述 输入一个字符串S,回答Q次问题,给你l,r,输出从Sl--Sr组成的串在S中出现了多少次. 输入 第一行为一个字符串S.第二行为一个正整数Q.接下来Q行每行为l,r. 输出 对于每个询问,输 ...

  10. 彻底卸载oracle数据库

    有时候因为各种各样的原因,我们不得不重装Oracle,但按照一般的操作,很多朋友用了oracle的删除,然后,你会发现重新安装时,点了下一步安装界面就消失了.事实证明,万能的重启也是解决不了问题的.往 ...