标签:
正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现。 一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。就像通配符“*.jpg”、“%ab%”,它是对字符串进行匹配的特殊字符串。
要想学会正则表达式,理解元字符是一个必须攻克的难关。不用刻意记
.:匹配任何单个字符(匹配的意思就是可以用……来替换,这里即:可以替换任何单个字符来替换)。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。
[ ] :匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。不管多少个区间,它只能匹配一个字符。
[abc[hij]]:任意一个a、b、c、h、i、j(合并)相当于a|b|c|h|i|j。
[a-z&&[hij]]:任意一个h、i、j(交集)
( ) :将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。
(?:pattern):匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern):正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern):正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern):反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern):反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
| :将两个匹配条件进行逻辑“或”运算。‘z|food‘ 能匹配 "z" 或 "food"。‘(z|f)ood‘ 则匹配 "zood" 或 "food"。
*:匹配0至多个在它之前的子表达式,和通配符*没关系。例如正则表达式“zo*”能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。
+ :匹配前面的子表达式一次或多次,和*对比(0到多次)。例如正则表达式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
? :匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。一般用来匹配“可选部分”。
{n} :匹配确定的 n 次。"zo{2}"→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。
{n,} :至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。
{n,m} :最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。
^(shift+6) :匹配一行的开始。例如正则表达式“^regex”能够匹配字符串“regex我会用”的开始,但是不能匹配“我会用regex”。
^另外一种意思:非!(暂时不用理解)
$ :匹配行结束符。例如正则表达式“浮云$” 能够匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”
\b:词的边界
\B:非词的边界
\G:前一个匹配的结束
–\d:代表一个数字,等同于[0-9]
–\D:代表非数字,等同于[^0-9]
–\s:代表换行符、Tab制表符等空白字符
–\S:代表非空白字符
–\w:匹配字母或数字或下划线或汉字,即能组成单词的字符
–\W:非\w ,等同于[^\w]
d:digital;s:space、w:word。大写就是“非”
注意:在java中斜杠(\)表示转义,所以要表示正则表达式中的斜杠(\)则需使用“\\”,即“\d”就要写成“\\d”。
贪婪型:假设我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它就会继续往下匹配。
勉强型:用问号(?)来指定。最少匹配的、非贪婪的。
占有型:目前,能在Java中才可使用。当正则表达式被用于字符串时,它会产生相当多的状态,以便在匹配失效时可以回溯。而“占有型”两次并不保存这些中间状态,因此可以防治回溯。常常用于防治正则表达式失控,因此可以使正则表达式执行起来更有效。
贪婪型 | 勉强型 | 占有型 | 如何匹配 |
X? | X?? | X?+ | 一个或零个X |
X* | X*? | X*+ | 零个或多个X |
X{n} | X{n}? | X{n}+ | 恰好n次X |
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher
对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches
方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher
类的实例用于此目的则不安全。
创建 Matcher
对象之后,可以使用它执行三种不同的匹配操作:
每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。
public static void p(Object o){ System.out.println(o); } public static void main(String[] args){ //matches()判断字符串是否匹配某个表达式,"."表示任何一个字符 p("abc".matches("...")); //将字符串"a2389a"中的数字用*替换,\d 表示“0--9”数字 p("a2389a".replaceAll("\\d", "*")); //将任何是a--z的字符串长度为3的字符串进行编译,这样可以加快匹配速度 Pattern p = Pattern.compile("[a-z]{3}"); //进行匹配,并将匹配结果放在Matcher对象中 Matcher m = p.matcher("abc"); p(m.matches()); //上面的三行代码可以用下面一行代码代替 p("abc".matches("[a-z]{3}")); }
p("a".matches("."));//true p("aa".matches("aa"));//true p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));//false
//group分组,用()分组 Pattern pttern = Pattern.compile("(\\d{3,5})([a-z]{2})"); String s = "123aa-34345bb-234cc-00"; Matcher matcher = pttern.matcher(s); p(matcher.groupCount());//2组 while(matcher.find()){ p(matcher.group());//数字字母都有 //p(matcher.group(1));//只有数字 // p(matcher.group(2));//只有字母 }
注:matcher.group(0)始终完整的待匹配的字符串。这里即为:"123aa-34345bb-234cc-00"。所以提取结果时应该从索引为1的位置开始。
标签:
原文地址:http://www.cnblogs.com/yaoyinglong/p/Java正则表达式.html