zoukankan      html  css  js  c++  java
  • 正则表达式--基础语法

    引言:正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

    参考教程:链接

    1. 正则表达式语法

    注意:在其他语言中, 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
    在 Java 中, 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
    所以,在其他的语言中,一个反斜杠就足以具有转义的作用,而在正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在正则表达式中,两个 代表其他语言中的一个 ,这也就是为什么表示一位数字的正则表达式是 d,而表示一个普通的反斜杠是 \。

    语法1

    语法2

    语法3

    语法4

    2. 提炼一下

    特殊字符

    1、^ 开始,放在[]中时,取反
    2、$ 结束
    3、* 零次及以上
    4、+ 一次及以上
    5、? 零次或一次,当此字符紧随任何其他限定符(星号、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。
    6、{n} n次
    7、{n,} n次及以上
    8、{n,m} n次~m次
    9、. 任何单个字符
    10、() 表示一组,(a*)ccc 匹配ccc和accc
    11、x|y x 或 y
    12、[xyz] []中的任意一个字符,a|b|c等价于[abc]
    13、[^xyz] 取反,任意xyz都不匹配,匹配除xyz之外的任意字符
    14、[a-z] 指定范围的任一字符,此项表示a-z之间任一小写字母
    15、| 或
    16、 转义
    17、/ 正则表达式的开始和结尾

    元字符

    1、 匹配字边界,例如,"er"匹配"never"中的"er",但不匹配"verb"中的"er"
    2、B 匹配非字边界,例如,"erB"匹配"verb"中的"er",但不匹配"never"中的"er"。
    3、d 数字字符,等效于 [0-9],如d{2,4}与12,123,1234匹配
    4、D 非数字字符,等效于 [^0-9],如D{2,4}与AC,ASCF匹配
    5、w 任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。
    6、W 与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。
    7、s 空白字符,如空格

    3. 示例

    1、表示匹配次数的符号

    假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“/”。

    假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示:

    下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。图三显示了完整的正则表达式。

    2、否”符号
    ”符号称为“否”符号。如果用在方括号内,“”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。

    3、圆括号和空白符号
    假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:

    新出现的“/s”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API(本文后面详细讨论)提取出它的值。修改后的正则表达式如图六所示:

    4、其它符号

    例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“/d”。修改后的正则表达式如图七所示:

    5、稍复杂点的应用示例
    (1)、日志文件处理
    任务:分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中,日志记录的格式如下:

    分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:IP地址和页面访问时间。你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。
    首先我们来看看IP地址。IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。因此,IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式:

    IP地址中的句点字符必须进行转义处理(前面加上“/”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。
    日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。

    现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。注意,为了匹配“- -”(但不提取它),正则表达式中间加入了“/s-/s-/s”。完整的正则表达式如图十所示。

    (2)HTML处理实例
    下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FONT标记如下所示:

    程序将按照如下形式,输出每一个FONT标记的属性:

    在这种情况下,建议使用两个正则表达式。第一个如图十一所示,它从字体标记提取出“"face="Arial, Serif" size="+2" color="red"”。

    第二个正则表达式如图十二所示,它把各个属性分割成名字-值对。

    分割结果为:

  • 相关阅读:
    Decrease (Judge ver.)
    Raising Modulo Numbers
    最短Hamilton路径
    64位整数乘法
    递归系列——数组和对象的相关递归
    函数内容新增——函数表达式
    数据结构和算法(一)——栈
    (转)jQuery中append(),prepend()与after(),before()的区别
    微信端的user-Agent
    less知识点总结(二)
  • 原文地址:https://www.cnblogs.com/wang-zai/p/7800028.html
Copyright © 2011-2022 走看看