《Java核心技术卷二》笔记(三)正则表达式
正则表达式语法
一个正则表达式描述了字符串的构成规则(模式)。如果一个具体的字符串正好符合正则表达式描述的这个规则,这个字符串就是与表达式匹配的。先看一下怎么描述这种规则,也就是正则表达式语法。正则表达式类似于前面文章中的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)
- 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)
static Pattern compile(String regex, int flags) 多个flags为相加,如Pattern.compile(regexStr, Pattern.DOTALL+Pattern.MULTILINE)。常用标识如下
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核心技术卷二》笔记(三)正则表达式的更多相关文章
- Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar
正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
- java核心技术学习笔记之一程序设计概述
Java 核心技术之一程序设计概述 一. Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向 ...
- java中的自动拆装箱与缓存(Java核心技术阅读笔记)
最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- 《Java核心技术卷二》笔记(二)文件操作和内存映射文件
文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...
- 《Java核心技术卷二》笔记(一)流与文件
一.流的概念 在Java中,可以提供字节序列的对象,或者可以接收字节序列的对象,都可以抽象成流.系统中的文件,网络,内存这些设备都可以读入或者写入字节,自然也可以用流的方式来操作.能向程序中提供字节序 ...
- Java核心技术卷二部分笔记
第1章 流与文件 1.2 文本输入与输出 第3章 网络 3.3 可中断套接字 第4章 数据库编程 4.5.2 读写LOB 4.6 可滚动和可更新的结果集 4.8 元数据 第6章 高级Swing 6.1 ...
随机推荐
- Machine Schedule(poj 1274)
题目大意:有n个奶牛和m个谷仓,现在每个奶牛有自己喜欢去的谷仓,并且它们只会去自己喜欢的谷仓吃东西,问最多有多少奶牛能够吃到东西 输入第一行给出n与m 接着n行 每行第一个数代表这个奶牛喜欢的谷仓的个 ...
- android 的四种枚举Context.MODE_PRIVATE
标签: mode_private Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加 ...
- vim 多窗口
打开多个文件: 1.vim还没有启动的时候: 在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件 2.vim已经启动 输入 :open file 可以再打开一 ...
- MyEclipse导入Maven项目
转自:http://blog.csdn.net/xuelu198708/article/details/8561115 导入分两种方法: 1.使用MyEclipse的普通工程导入,步骤如下: 1> ...
- HttpSession--会话
- 【log4j2 加载配置文件】 加载配置文件的三种方法
log4j 2读取的配置文件可以分为三类:src下的配置文件.绝对路径的配置文件.相对路径的配置文件. package com.herman.test; import java.io.File; im ...
- [MySQL]导入导出
[MySQL]导入导出 一 导入文本数据 1)mysql->load data infile 数据文件c:/mytable.txt 如下:(每一行为一条记录,记录的字段间用tab隔开,最后一个字 ...
- python 添加类属性
类属性必须赋值. 创建类属性 类是模板,而实例则是根据类创建的对象. 绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有 ...
- Spring的bean标签
Spring框架中主要有四种标签bean.alias.import.beans,其中bean标签是其他标签的基础. 一.bean标签的属性 scope:用来配置spring bean的作用域 sing ...
- node相关--socket.io
使用Socket.IO可以避免webSocket产生的问题: 传输: Socket.IO中消息的传递是基于传输的,而非全部依靠WebSocket; 它总会尝试选择对用户来说速度最快.对服务器性能来说最 ...