当前位置:文档之家› Java正则表达式

Java正则表达式

JAVA正则表达式
正则表达式的定义和作用
定义:正则表达式是指一个用来描述或者匹配一系列符合某 个句法规则的字符串的单个字符串。
作用: • 测试字符串的某个模式。 例如,可以对一个输入字符串进行测试,看在该字符串 是否存在一个电话号码模式或一个信用卡号码模式。这称 为数据有效性验证 • 替换文本。 可以在文档中使用一个正则表达式来标识特定文字,然 后可以全部将其删除,或者替换为别的文字 • 根据模式匹配从字符串中提取一个子字符串。 可以用来在文本或输入字段中查找特定文字
字符类 (直接量的'或'集合)
1. 单独的直接符放进中括号内就可以组合成字符类.一个字符类和它所 包含的任何一个字符都匹配 如: /[a-z] / 匹配小写字母 2. 还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的 字符外的所有字符 如:/ [^a-z]/ 匹配除小写字母之外的全部字符 3.由于某些字符类非常常用,所以正则表达式语法包含一些特殊字符和转 义序列来表示这些常用的类. 例: . 除了换行符之外的任意字符,等价于[^\n] \w 任何单字字符, 等价于[a-zA-Z0-9_] \W 任何非单字字符,等价于[^a-zA-Z0-9_] \s 任何空白符,等价于[\ t \ n \ r \ f \ v] \S 任何非空白符,等价于[^\ t \ n \ r \ f \ v] \d 任何数字,等价于[0-9] \D 除了数字之外的任何字符,等价于[^0-9] [\b] 一个退格直接量(特例)
(?<=exp) 零宽度正回顾后发断言,它断言自身出现的位置的前面能 匹配表达式exp
(?!exp) 零宽度负预测先行断言,断言此位置的后面不能匹配表达 式exp。
(?<!exp) 零宽度负回顾后发断言来断言此位置的前面不能匹配表达 式exp
贪婪匹配和非贪婪匹配
• 针对文本 "dxxxdxxxd" • (d)(\w+) "\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd" • (d)(\w+)(d) "\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的 所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但 是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配 的最后一个 "d“
懒惰限定符
代码/语法 *?
+? ??
描述 重复任意次,但尽可能少重复
重复1次或更多次,但尽可能少重复 重复0次或1次,但尽可能少重复
{n,m}?
{n,}?
重复n到m次,但尽可能少重复
重复n次以上,但尽可能少重复
优先级顺序
• 正则表达式存在元字符、转义符、限定符、|等操作或表达式。在匹 配过程中,正则表达式都事先规定了这些操作或表达式的优先级。正 则表达式也可以象数学表达式一样来求值。也就是说,正则表达式可 以从左至右、并按照一个给定的优先级来求值。下按照从最高优先级 到最低优先级列出了正则表达式操作符的优先级顺序。
public int flags()方法: 返回当前Pattern模式类的匹配flag参 数。
public Matcher matcher(CharSequence input)方法: 使用指定的参数input生成一个的匹配器Matcher对象。
public static boolean matches(String regex, CharSequence input) 利用给定的正则表达式对参数指定的input字符串进行匹配,匹配模 式为该正则表达式的模式。 public String pattern()方法: 返回该Patter对象所编译的正则表达式的字符串形式结果。 public String[] split(CharSequence input)方法: 将参数字符串input按照Pattern里所包含的正则表达式进行分割,返 回结果为一个字符串组。 public String[] split(CharSequence input, int limit)方法: 该方法作用与public String[] split(CharSequence input)方法一 样。不同的是增加了参数limit,limit的作用是限定划分的个数,即 如果limit为3,则只能将指定的字符串分为3段。 public String toString()方法:返回该匹配模式的字符串表示形式。
\k< name > 或 \k’name ‘
非捕获组(零宽断言)
它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以? 号开头,那么这个分组就不会捕获文本,当然也不会有组的编号, 因此也不存在Back 引用。 (?:pattern) 匹配pattern但不获取匹配结果; 例:“industr(?:y|ies)”就是一个比“industry|industries”更 简略的表达式。 (?=exp) 零宽度正预测先行断言,它断言自身出现的位置的后面能 匹配表符 自身 2.转异字符 \ f 换页符 \ n 换行符 \ r 回车 \ t 制表符 \ v 垂直制表符 \ XXX 由十进制数 XXX 指 定的ASCII码字符 \ Xnn 由十六进制数 nn 指定的ASCII码字符 \ cX X是一个控制符,/\cM/匹配Ctrl-M 3.特殊的标点符号 正则表达式中使用特殊的标点符号,必须在它们之前加上一个 "\" 转异 / \ . * + ? | ( ) { } [ ] 如: /\?/ 匹配"?"
操作符或表达式 / ()、(?:)、(?=)、[] *、+、?、{n}、{n,}、 {n,m} ^、$、/(元字符) | 说明 转义符 圆括号和方括号 限定符 位置和顺序 “或”操作
java的regex包
在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,即 java.util.regex包。 java.util.regex 包主要由三个类所组成:Pattern 、 Matcher 和 PatternSyntaxException 。 1.Pattern 对象表示一个已编译的正则表达式。Pattern 类没有提供公 共的构造方法。要构建一个模式,首先必须调用公共的静态 compile 方法,它将返回一个 Pattern 对象。这个方法接受正则表达式作为 第一个参数。 2.Matcher 是一个靠着输入的字符串来解析这个模式和完成匹配操作的 对象。与 Pattern 相似,Matcher 也没有定义公共的构造方法,需 要通过调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对 象。 3.PatternSyntaxException 对象是一个未检查异常,指示了正则表达式 中的一个语法错误。
选择(分支)
• 当一个字符串的某一子串具有多种可能时,采用分支结构来匹配, “|”表示多个子表达式之间“或”的关系,“|”是以()限定范围的, 如果在“|”的左右两侧没有()来限定范围,那么它的作用范围即为 “|”左右两侧整体。 举例: “^aa|b$”在匹配“cccb”时,是可以匹配成功的,匹配的结果是 “b”,因为这个表达式表示匹配“^aa”或“b$”,而“b$”在匹配 “cccb ”时是可以匹配成功的。 “^(aa|b)$”在区配“cccb”时,是匹配失败的,因为这个表达式表示 在“开始”和“结束”位置之间只能是“aa”或“b”,而“cccb” 显然是不满足的。
复制
描述相同匹配规则的零个、一个或多个正则表达式的复制字 符。 • {n, m} 匹配前一项至少n次,但是不能超过m次 • {n, } 匹配前一项n次,或者多次 • {n} 匹配前一项恰好n次 • ? 匹配前一项0次或1次,也就是说前一项是可选的. 等价 于 {0, 1} • + 匹配前一项1次或多次,等价于{1,} • * 匹配前一项0次或多次.等价于{0,} 如:/\d{5}/ 匹配五位整数 /\s+java\s+/ 匹配字符串"java" ,并且该串前后 可以有一个或多个空格.
匹配pattern并捕获 结果,自动设置组号
匹配pattern并捕获 结果,设置name为组 名
(abc)+d 匹配abcd或者 abcabcd
(?<name>pattern)
\num
对捕获组的反向引用。 (\w)(\w)\2\1 其中 num 是一个正 匹配abba 整数。 对命名捕获组的反向 引用。其中 name 是 捕获组名。 (?<group>\w)abc\k< group> 匹配xabcx
Pattern类的主要方法
static Pattern compile(String regex)方法: 将给定的正则表达式regex编译并将其赋值给一个Pattern对象。
static Pattern compile(String regex, int flags)方法: 该方法与上一个方法的区别是增加了参数flag。flag参数可以是 CASE_INSENSITIVE、MULTILINE、DOTALL、UNICODE_CASE、CANON_EQ 、UNIX_LINES、LITERAL和COMMENTS。flag参数能用来改变处理正则 表达式的方式
正则表达式的组成
• 正则表达式由一些普通字符和一些元字符( metacharacters)组成。 • 普通字符包括大小写的字母和数字,而元字符则具有特殊 的含义。 • 在最简单的情况下,一个正则表达式看上去就是一个普通 的查找串。例如,正则表达式"testing"中没有包含任何 元字符,它可以匹配"testing"和"123testing"等字符串 ,但是不能匹配"Testing"。 • 要想真正的用好正则表达式,正确的理解元字符是最重要 的事情。
相关主题