您的位置:首页 > 职场人生

黑马程序员--JAVA<正则表达式>

2015-07-27 22:56 489 查看
——- 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时,由于已经匹配,就跳出了非捕获组,而不再次对组内的字符进行匹配。可以加快速度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: