正则表达式语法详解

原创 2015年07月07日 23:55:46

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

匹配单个字符

  • 匹配纯文本
    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、 基本语法表述 字符 描述 \ 转义字符。例如, “\n”匹配一个换行符。 “\\”匹配“\”。 ^...

JS正则表达式语法详解

JS正则表达式语法详解 2016-04-22 16:36 96人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 正则表达式(2) ...

java正则表达式语法详解及其使用代码实例

原文:java正则表达式语法详解及其使用代码实例 源代码下载地址:http://www.zuidaima.com/share/1835085544524800.htm Regula...

JS正则表达式——语法详解(一)

1. 正则表达式规则 1.1 普通字符     字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符...

C#正则表达式语法规则详解(详细好理解)

正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter)  字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde"的字符串。 元字符则...

C#正则表达式语法规则详解

正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter)  字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde"的字符串。 元字符则...
  • lrxin
  • lrxin
  • 2014-10-21 14:59
  • 388

正则表达式语法实例详解

正则表达式语法详解,实例详解,本文将介绍正则表达式的基础语法,采用了通用Perl 表达式语法,通过PHP语法编写了实例。 通过此文,可以学习到如何写出需求所需要的正则,并且读懂看似神秘复杂的正则表达式...

C#正则表达式语法规则详解

正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter)  字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde"的字符串。 元字符则更加灵活运...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)