正则表达式语法详解

正则表达式的基本用途即:搜索与替换。给定一个正则表达式,他要么匹配一些文本(进行一次搜索),要么匹配并替换一些文本(进行一次替换)。

匹配单个字符

  • 匹配纯文本
    egreg="string";其中string即为需匹配的字符。需要注意:正则表达式是区分大小写的,即String不匹配string

  • 匹配任意字符
    egreg=".";其中.(英文句号)用于匹配任何一个单个的字符、字母、数字甚至是.字符本身

  • 匹配特殊字符
    egreg="\.";其中\(反斜杠)是一个元字符,用来对其后的符号进行转义。由于.字符在正则表达式中有特殊含义,所以需要用\来对其进行转义,.即匹配.字符本身
    注意:如果需要搜索\本身,则需要对\进行转义,即reg="\\";

匹配一组字符

  • 匹配多个字符中的某一个
    egreg="[ns]";[]不匹配任何字符,它们只负责定义一个字符集和,这个集合将匹配字符n或s
    egreg="[NnSs]";这个集合将匹配字符N、n、S、s

  • 匹配字符集和区间
    egreg="[0123456789]";reg="[0-9]";这个集合将匹配任何一个数字
    egreg="[A-Za-z]";这个集合将匹配任何一个大小写字母

  • 取非匹配
    egreg="[^0-9]";其中元字符^表示对这个字符集合进行取非匹配,这个集合将匹配除了数字以外的任何字符

使用元字符

  • 对特殊字符进行转义
    egreg="\[\]";这个集合将匹配[],任何一个元字符都可以通过给他加上一个反斜杠字符(\)作为前缀的办法来转义

  • 匹配空白字符

    元字符说明
    [\b]回退(并删除)一个字符(Backspace键)
    \f换页符
    \n换行符
    \r回车符
    \t制表符(Tab键)
    \v垂直制表符

    egreg="\r\n\r\n";匹配windows系统中2条记录之间的一个空白行
    egreg="\n\n";匹配linux系统中2条记录之间的一个空白行

  • 匹配特定的字符类别

    元字符说明
    \d任何一个数字字符(等价于[0-9])
    \D任何一个非数字字符(等价于[^0-9])
    \w任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9_])
    \W任何一个非字母数字字符或非下划线字符(等价于[^a-zA-Z0-9_])
    \s任何一个空白字符(等价于[\f\n\r\t\v])
    \S任何一个非空白字符(等价于[^\f\n\r\t\v])

    egreg="\d";匹配任意一个数字字符
    egreg="\w+[\w\.]*@[\w\.]+\.\w+";匹配合法的电子邮件

  • 使用16进制与8进制
    egreg="\x0A";\x0A对应于ASCII字符10(换行符),其效果等价于\n
    egreg="\011";\011对应于ASCII字符9(制表符),其效果等价于\t

  • 使用POSIX字符类

    字符集说明
    [:alnum:]任何一个字母或数字(等价于[a-zA-Z0-9])
    [:alpha:]任何一个字母(等价于[a-zA-Z])
    [:blank:]空格或制表符(等价于[\t])
    [:cntrl:]ASCII控制字符(ASCII 0-31,再加上ASCII 127)
    [:digit:]任何一个数字(等价于[0-9])
    [:graph:]和[:print:]一样,但不包括空格
    [:lower:]任何一个小写字母(等价于[a-z])
    [:print:]任何一个可打印字符
    [:punct:]既不属于[:alnum:],也不属于[:cntrl:]的任何一个字符
    [:space:]任何一个空白字符,包括空格(等价于[^\f\n\r\t\v])
    [:upper:]任何一个大写字母(等价于[A-Z])
    [:xdigit:]任何一个十六进制数字(等价于[a-fA-F0-9])

    egreg="[[:xdigit:]]";,等价于字符集和[a-fA-F0-9]

重复匹配

  • 匹配一个或多个字符
    egreg="\w+";,其中+是一个元字符,可以用来匹配一个或多个字符,该集合匹配一个或多个字母数字或_字符
    egreg="[0-9]+";,该集合匹配一个或多个数字

  • 匹配零个或多个字符
    egreg="\w*";,*的用法与+完全一样,只要把它放在一个字符(或一个字符集合)的后面,就可以匹配该字符(或字符集合)连续出现零次或多次的情况

  • 匹配零个或一个字符
    egreg="https?";?只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次。若该字符可能出现,也可能不出现,则?无疑是最佳的选择。该集合指字符?前面的字符s要么不出现,要么最多出现一次

  • 匹配的重复次数
    egreg="\d{6}";,指匹配6个数字字符。{}是元字符
    egreg="\d{2,4}";,指最少重复2次,最多重复4次
    egreg="\d{3,}";,指至少重复3次

  • 防止过度匹配
    eg
    文本:<B>AK</B>and<B>HI</B>
    正则表达式:reg="<[Bb]>.*</[Bb]>";*+都是所谓的贪婪型元字符
    匹配结果:**<B>AK</B>and<B>HI</B>**
    正则表达式:reg="<[Bb]>.*?</[Bb]>";*+都是所谓的贪婪型元字符
    匹配结果:**<B>AK</B>** **<B>HI</B>**
    其中,?*+的懒惰型版本

位置匹配

  • 边界
    eg
    文本:The cat s**cat**tered his food all over the room
    正则表达式:reg="cat";
    匹配结果:cat cat
    即将单词中的cat也匹配出来了

  • 单词边界
    eg
    文本:The cat scattered his food all over the room
    正则表达式:reg="\bcat\b";
    匹配结果:cat
    \b匹配的是这样一个位置,这个位置位于一个能够用来构成单词的字符(字母、数字和下划线,也就是与\w相匹配的字符)和一个不能用来构成单词的字符(也就是与\W相匹配的字符)之间
    eg
    文本:nine-digit color - coded
    正则表达式:reg="\B-\B";
    匹配结果:-
    \B匹配一个前后都不是单词边界的字符

  • 字符串边界
    一个用来定义字符串边界的元字符有两个:一个是用来定义字符串开头的^,一个是用来定义字符串结尾的$
    egreg="^\s*<\?xml.*\?>";
    egreg="</[Hh][Tt][Mm][Ll]>\s*$";

  • 分行匹配模式
    egreg="(?m)^\s*//.*$";把换行符视为一个字符串分隔符
    元字符序列(?m)把行分隔符当做一个字符串分隔符来对待,(?m)必须出现在整个模式的最前面。在分行匹配模式下,^不仅匹配正常的字符串开头,还将匹配行分隔符(换行符)后面的开始位置;$不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置

使用子表达式

  • 子表达式
    egreg="(&nbsp;){2,}";子表达式必须用()括起来,其中()是元字符
    egreg="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}";等价于reg="(\d{1,3}\.){3}\d{1,3}";
    egreg="(19|20)\d{2}";匹配19或者20开头的4位数字

  • 子表达式的嵌套
    egreg="(((\d{1,2})|(1\d{2})|(2([0-4])\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2([0-4])\d)|(25[0-5]))";匹配合法的IP地址

回溯引用-前后一致匹配

  • 回溯引用匹配
    egreg="[ ]+(\w+)[ ]+\1";其中\1代表模式里的第一个子表达式,他引用的是前面划分出来的第一个子表达式,\2代表第二个子表达式,\3代表第三个,依次类推
    egreg="<[Hh][1-6]>.*?</[Hh]\1>";\1只匹配与之相同的数字

  • 回溯引用在替换中的应用
    eg
    文本:hello,ben@forta.com is my email address.
    `reg=”(\w+[\w.]*@[\w.]+.\w+)”;
    rep=”“;
    结果:
    ben@forta.com is my email address.

  • 大小写转换

    字符集说明
    \E结束\L或\U转换
    \l把下一个字符转换为小写
    \L把\L到\E之间的字符全部转换为小写
    \u把下一个字符转换为大写
    \U把\U到\E之间的字符全部转换为大写

前后查找

-向前查找
一个向前查找模式就是一个以?=开头的子表达式,需要匹配的文本跟在=的后面
egreg=".+(?=:)";匹配:之前的一个或多个字符。?=意思指只要找到:就行了,不要把它包括在最终的匹配结果里,就是不消费它

-向后查找
一个向前查找模式就是一个以?<=开头的子表达式,需要匹配的文本跟在=的后面
egreg="(?<=:).+";匹配:之后的一个或多个字符。只要找到:就行了,不要把它包括在最终的匹配结果里,就是不消费它

-把向前查找和向后查找结合起来
egreg="(?<=<[Tt][Ii][Tt][Ll][Ee]>).*(?=</[Tt][Ii][Tt][Ll][Ee]>)";匹配与之后的零个或多个字符

-对前后查找取非

操作符说明
(?=)正向前查找
(?!)负向前查找
(?<=)正向后查找
(?负向后查找

嵌入条件

  • 回溯引用条件
    egreg="(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}";其中?(1)判断第一个子表达式是否存在,如果(1)存在,则必须要匹配其后的字符,如果(1)不存在,则必须匹配|后的字符。(?(1))|-)是一个回溯引用条件

  • 前后查找条件
    egreg="\d{5}(?(?=-)-\d{4})";其中?(?=-)判断(?=-)子表达式是否存在,如果存在,则必须要匹配其后的字符。(?(?=-)-\d{4})是一个前后查找条件

附正则表达式搜索和替换的相关代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
    public static void main(String[] args)
    {
        String str = "hello,ben@forta.com is my email address.";
        //正则表达式
        String reg = "(\\w+[\\w\\.]*@[\\w\\.]+\\.\\w+)";
        //替换
        String rep = "<A HREF=\"mailto:$1\">$1</A>";
        Matcher m = Pattern.compile(reg).matcher(str);
        //打印匹配到的字符
        while(m.find())
        {
            System.out.println(m.group());
        }
        //打印替换后的字符串
        System.out.println(m.replaceAll(rep));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值