正则表达式详解

一、使用方法

使用方法有两种:

第一种:

Pattern p = Pattern.compile("[abc]");
        Matcher matcher = p.matcher("b");
        Boolean b = matcher.matches();

第二种:

Boolean c = Pattern.matches("[abc]", "a");

注意,前面才是表达式,后面是被匹配的东西~

二、基础说明

  1. 字母的大小写问题
    正则表达式里是区分大小写的,apple跟Apple匹配的结果是不一样的。

  2. 匹配任意字符
    .字符(英文句号)可以匹配任何一个单个的字符、字母、数字甚至是.字符本身,相当于DOS文件搜索功能里的?,SQL中的_(下划线)字符。

    举个栗子:
    (1)文本:
    sales.xls
    sales1.xls
    orders3.xls
    na1.xls
    sa1.xls
    (2)正则表达式:
    sales.
    (3)匹配结果:
    sales.xls
    sales1.xls

    备注:. 字符可以使用多个的,如果只匹配. 字符本身,就用\ 字符,用 \ .表示。

  3. 匹配某个字符
    表达式[ns]表示匹配n或者s单个字符。

  4. 字符区间
    表达式[0-9]表示匹配0-9之间的一位数字,等价于[0123456789]。

    同理,A-Z表示A到Z所有大写字母;
    a-z表示a-z所有小写字母

    表达式[A-Za-z0-9]表示任何一个字母(无论大小写)或者数字。

    举个栗子
    (1)文本:
    sales.xls
    sales1.xls
    orders3.xls
    na1.xls
    sa1.xls
    (2)正则表达式:
    [ns]a[0-9].xls
    (3)匹配结果:
    na1.xls
    sa1.xls

  5. 取非匹配

    表达式[^0-9]表示不是数字的字符。

三、使用元字符

  1. 特殊字符转义

    除了上述的.字符,再比如[ 这个元字符,在正则中用来表示一个区间,如果要匹配本身就用[;
    如果要匹配\这个字符,就用\来匹配。

    注意:\这个字符是不可以单独出现在正则表达式中的,其后必跟着另一个字符。

  2. 匹配数字与非数字

    \d 表示任何一个数字,等价于[0-9];
    \D 表示任何一个非数字,等价于[^0-9].

  3. 匹配字母和数字,以及非字母和数字

    \w 表示任何一个字母数字字符(包括大小写)或下划线,等价于[a-zA-Z0-9_];
    \W 表示任何一个非字母数字或非下划线字符,等价于[^a-zA-Z0-9_]

  4. 匹配空白字符,以及非空白字符

    \s 表示任何一个空白字符,等价于[\f\n\r\t\v]
    \S 表示任何一个非空白字符,等价于[^\f\n\r\t\v]

四、重复匹配

  1. 匹配一个或多个字符

    +表示匹配一个或多个这样的字符,举个栗子
    [0-9]匹配单个数字,[0-9]+匹配一个或多个连续出现的数字。

  2. 匹配零个或多个字符

    +至少要匹配一个字符,而*可以匹配一个字符出现零次或者多次。

  3. 匹配零个或一个字符

    ?匹配一个字符出现零次或者一次,最多不超过一次。

  4. 匹配指定重复次数

    {}匹配一个字符出现特定次数,举个栗子
    a{3}匹配aaa。

  5. 重复次数是一个区间

    a{2,6}表示a出现2到6次。

  6. 至少重复多少次

    a{2, }表示a至少出现2次。

五、位置匹配

边界限定符的概念

举个栗子
The cat scattered his food all over the room.

如果正则表达式是cat的话,会匹配出两个单词cat 和 scatter,如果只想匹配出cat呢?
这就引发了我们的深思,于是就有了边界限定符的概念。

  • 单词边界

    第一种边界也就是最常用的—单词边界,用限定符\b来指定,用来匹配一个单词的开始或结尾。
    来看下面这个栗子
    The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.

    正则表达式如果是
    cap\b
    就会匹配到cap跟recap

    正则表达式如果是
    \bcap
    就会匹配到cap、cape以及capsized

    正则表达式如果是
    \bcap\b
    就会匹配到cap

    这里还有一种情况,举个栗子
    文本:
    Please enter the nine-digit id as it appears on your color - coded pass-key.

    在这个文本里,color - coded左右都有一个空格,而nine-digit和pass-key都没有,那么如何来匹配这种“空格字符空格”这样的连字符呢?这里就用\B字符。
    正则表达式如果是
    \B-\B就可以匹配到前后都有多余空格的连字符。

以上就是边界匹配。

  • 字符串匹配

    ^匹配一个字符串的开头,$匹配一个字符串的结尾

    有这样一种情况:
    合法的XML文件文档必须以 < ?xml>标签开头并带有一些其他的属性。
    文本:

 This is wrong.
< ?xml version="1.0" encoding="ISO-8859-1"?>
< web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

正则表达式:
< \?xml.*\?>

结果就会匹配到第二行,但是这个文件却不是一个合法的XML文件,这里需要被匹配到的< ?xml>标签在字符串的最开始处,就需要用到元字符^。

元字符^有多种用途,在前面提到,当^在方括号[和]之间并紧跟在左方括号[后面的时候,like this,[^0-9],这样的格式可以用作求非;

元字符^还可以用来匹配一个字符串的开头位置。

正则表达式如果是
^\s*< \?xml.*\?>
就可以用来判断< ?xml>标签是否在字符串的最开始,这里的\s*是为了解决< ?xml>标签前允许有空格,制表符,换行符等空白字符的问题。

那么还有一种情况,在一个web页面里,< /html>标签后面不应该再有任何实际内容,那就可以用正则表达式
< /[Hh][Tt][Mm][Ll]>\s* 匹配了一个字符串的结尾,\s*表示了零个或多个空白字符。

六、使用子表达式

  • 子表达式

    HTML中常会用非换行型&nbsp ;,一用就用好几个,那怎样匹配多个&nbsp ;呢?
    前面说到花括号{}可以用来表示字符重复的次数,但是正则表达式为
    &nbsp ;{2, }
    并不能匹配到&nbsp ;&nbsp ; ,只能匹配到&nbsp ;;;;;这样的字符串,因为{2, }只能作用于紧挨着它的前一个字符,所以该正则表达式就应该改成
    (&nbsp ;){2, }
    就可以达到预期的效果。这里就用元字符(和)将子表达式括起来了。

  • 重复的子表达式
    这是什么意思呢?举个栗子,假如现在要匹配一个IP地址,IP地址的格式是用英文句号.分隔的四组数字,如12.150.46.200,正则表达式如果是
    \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
    是可以匹配到IP地址的,但是我们注意到,这里\d{1,3}.这个表达式重复了三次,所以可以写为
    (\d{1,3}.){3}\d{1,3}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值