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

——- 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时,由于已经匹配,就跳出了非捕获组,而不再次对组内的字符进行匹配。可以加快速度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值