——- android培训、java培训、期待与您交流! ———-
概述
- 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 ‘a’ 和 任意个 ‘b’ ”,那么 ‘ab’, ‘abb’, ‘abbbbbbbbbb’ 都符合这个特征。
正则表达式可以用来:
- (1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。
- (2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。
- (3)用来替换,比普通的替换更强大。 正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅 入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首 先要理解的
常用的正则表达式
(1):特殊字符
- \\:反斜线字符。在书写时要写为\\。(注意:因为java在第一次解析时,把\\解析成正则表达式\,在第二次解析时再解析为\,所以凡是不是1.1列举到的转义字符,包括1.1的\,而又带有\的都要写两次)
- \r:回车
- \n:换行
(2):字符类
- [abc]: a、b或 c(简单类)。例如[egd]表示包含有字符e、g或d。
- [^abc]:任何字符,除了 a、b或 c(否定)。例如[^egd]表示不包含字符e、g或d。
- [a-zA-Z]:包括了26个英文字母。
- [0-9]:包括了0-9这个10个数字字符。
(3):预定义字符类
- . 任意字符
- \d 数字[0-9]
- \D 非数字[^0-9]
- \w 单词字符:[a-zA-Z_0-9]
- \W 非单词字符:[^\w]
(4):边界匹配器
- ^ 行的开头,请在正则表达式的开始处使用^。例如:^(abc)表示以abc开头的字符串。注意编译的时候要设置参数MULTILINE,如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);
- 行的结尾,请在正则表达式的结束处使用。例如:(bca).∗(abc )表示以bca开头以abc结尾的行
- \b 单词边界。例如\b(abc)表示单词的开始或结束包含有abc,(abcjj、jjabc 都可以匹配)
- \B 非单词边界。例如\B(abc)表示单词的中间包含有abc,(jjabcjj匹配而jjabc、abcjj不匹配)
- \G 上一个匹配的结尾(个人感觉这个参数没什么用)。例如\Gdog表示在上一个匹配结尾处查找dog如果没有的话则从开头查找,注意如果开头不是dog则不能匹配。
- \Z 输入的结尾,仅用于最后的结束符(如果有的话) 行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。 以下代码被识别为行结束符: ‐新行(换行)符 (‘\n’)、 ‐后面紧跟新行符的回车符 (“\r\n”)、 ‐单独的回车符 (‘\r’)、 ‐下一行字符 (‘\u0085’)、 ‐行分隔符 (‘\u2028’) 或 ‐段落分隔符 (‘\u2029)。
- \z 输入的结尾 当编译模式时,可以设置一个或多个标志,例如 Pattern pattern = Pattern.compile(patternString,Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE); 下面六个标志都是支持的: ‐CASE_INSENSITIVE:匹配字符时与大小写无关,该标志默认只考虑US ASCII字符。 ‐UNICODE_CASE:当与CASE_INSENSITIVE结合时,使用Unicode字母匹配 ‐MULTILINE:^和 匹配一行的开始和结尾,而不是整个输入‐UNIXLINES:当在多行模式下匹配和 时,只将’\n’看作行终止符 ‐DOTALL: 当使用此标志时,.符号匹配包括行终止符在内的所有字符 ‐CANON_EQ: 考虑Unicode字符的规范等价
(5):Greedy 数量词
- x? 0次或1次
- x* 0次或多次
- x+ 1次或多次
- x{n} 恰好n次
- x{n,} 至少n次
- x{m,n} 至少m次,但不能超过n次
- (6)特殊构造(非捕获)
- (?:X) X,作为非捕获组
- (?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off。比如:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配 idmsux说明如下:
- ‐i CASE_INSENSITIVE :US-ASCII 字符集不区分大小写。(?i) ‐d UNIX_LINES : 打开UNIX换行符
- ‐m MULTILINE :多行模式(?m) UNIX下换行为\n WINDOWS下换行为\r\n(?s)
- ‐u UNICODE_CASE : Unicode 不区分大小写。(?u)
- ‐x COMMENTS :可以在pattern里面使用注解,忽略pattern里面的whitespace,以及”#”一直到结尾(#后面为注解)。
- (?x)例如(?x)abc#asfsdadsa可以匹配字符串abc
- (?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组。 与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def)
- (?=X) X,通过零宽度的正 lookahead。零宽度正先行断言,仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 表示字母后面跟数字,但不捕获数字(不回溯)
- (?!X) X,通过零宽度的负 lookahead。零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,\w+(?!\d) 表示字母后面不跟数字,且不捕获数字。
- (?<=X) X,通过零宽度的正 lookbehind。零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 表示99前面是数字19,但不捕获前面的19。(不回溯)
- (? (?>X) X,作为独立的非捕获组(不回溯)
- (?=X)与(?>X)的区别在于(?>X)是不回溯的。例如被匹配的字符串为abcm 当表达式为a(?:b|bc)m是可以匹配的,而当表达式是a(?>b|bc)时是不能匹配的,因为当后者匹配到b时,由于已经匹配,就跳出了非捕获组,而不再次对组内的字符进行匹配。可以加快速度