菜鸟级-正则表达式

正则表达式

正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如:

  • 检查文本中是否含有指定的特征词
  • 找出文中匹配特征词的位置
  • 从文本中提取信息,比如:字符串的子串
  •  修改文本

 

正则表达式是什么?

         正则表达式只是一个字符串。没有长度限制,但是,这样的正则表达式长度往往较短

         如下所示:

  • I  had  a  \s  +  day  today
  •  [A – Z a – z 0 – 9\-_]{ 3,16 }
  •   \d\d\d\d-\d\d-\d\d
  •   V(\d+)(\.\d+)*
  •   TotalMessages=’’(.*?)’’
  •  <[^<>]>
  • 每一个正则表达式都有输入(文本)和输出(匹配规则的输出,有时是修改后的文本)

特别提醒:正则表达式与文本统配语法无关,比如 *.xml

正则表达式的基础语法

字符

正则表达式中包含了一系列字符,这些字符只能匹配他们本身。有一些被称为“元字符”的特殊字符,可以匹配一些特殊规则

如下所示,红色为元字符

  •  I  had  a  \s  +  day  today
  •  [A – Z a – z 0 – 9\-_]{ 3,16 }
  •  \d\d\d\d-\d\d-\d\d
  •   V(\d+)(\.\d+)*
  •  TotalMessages=’’(.*?)’’
  •   <[^<>]>

大部分的字符,包括所有的字母和数字字符,是普通字符。也就意味着,他们只能匹配他们自己。

 

到目前为止,正则表达式的功能类似于

  •   常规的find功能
  •   Java中的 String.indexOf() 函数
  •   PHP中的 strops()函数
  •  等等

 

注意:不做特殊说明,正则表达式中是区分大小写的。但是,几乎所有的正则表达式的实现,都会提供一个Flag用来控制是否区分大小写。

  1. “ . ”

    元字符“.”,意味着可以匹配任意字符

    如:c.t可以匹配cat,cot,cxt……

  2.“ \”

  使用反斜杠“\”可以忽略元字符,使得元字符的功能与普通字符一样。

  如:c\.t    表示找到字母c,然后是一个句号(“.”),紧跟着是字母t

 

反斜杠“\”本身也是一个元字符,这意味着反斜杠本身也可以通过相似的方法变回到普通字符的用途。因此,正则表达式:

c\\t  表示匹配 以字符c开头,然后是一个反斜杠(\),紧跟着是字母t

 

 

 

字符类

           字符类是一组在方括号内的字符,表示可以匹配其中的任何一个字符

  •   A[0-9]t  表示匹配以A开头,接着是0-9中任何一位字符,最后以t结尾
  •  [\[\]\ab]表示匹配的字符为“[”或者“]”或者“a”或者“b”
  • l  [\\\[\]] 表示匹配的字符是“\”或者“[”或者“]”

 

在字符类中,字符的重复出现和出现顺序并不重要。[dabaaabcc]和[abcd]是相同的

重要提示:字符类中和字符类外的规则有时不同,一些字符在字符类中是元字符,在字符类外是普通字符。一些字符正好相反。还有一些字符在字符类中和字符类外都是元字符,这要视情况而定!

 

在字符集中,短横线(-)表示匹配字母或数字的范围([0-9]),在字符类之外,短横线没有特殊含义(a-z:表示匹配字符串以a开头,然后是一个短横线,以z结尾)

注意:范围的字符值代表的是字符而已,并不能代表数值范围,比如[1-31]表示匹配一个数字,是1或者2或者3,而不是匹配一个数值在1到31之间的数

 

字符类的反义(在字符的起始位置放一个反义符)

  •   [^a]表示匹配任何不为a的字符
  •   [\^ab]表示匹配一个为“^”或者a或者b的字符
  •   [^\^]表示匹配任何不为“^”的字符

 

转义字符类

\d  这个正则表达式与[0-9]作用相同,都是匹配一个数字(要匹配\d,应该使用正则表达式\\d)

\w  与[0-9A-Za-z]相同,都表示匹配一个数字或字母字符

\s   意味着匹配一个空字符(空格、制表符,回车或者换行)

         另外

  •   \D  与[^0-9]相同,表示匹配一个非数字字符
  • l  \W  与[^0-9A-Za-z]相同,表示匹配一个非数字同时不是字母的字符
  • l  \S    表示匹配一个非空字符

 

 

重复

在字符或字符集之后,你可以使用{ }大括号来表示重复

  • l  a{1}与a意思相同
  • l  a{3}匹配“aaa”字符串
  • l  a\{2\}表示匹配字符串“a{2}”
  • l  在字符类中,大括号没有特殊含义。[{}]表示匹配一个{或者}

 

指定重复次数范围

重复次数是可以指定范围的

  •   x{4,4} 与x{4}相同
  •  colou{0,1}r 表示匹配colour或者 color
  •   a{3,5} aaaaa aaaa aaa
  •   范围可以是开区间:a{1,}匹配一个或以上连续字符a

注意:这样的正则表达式会优先匹配最长字符串

 

 

关于重复的转义字符

  •   ?与{0,1}相同,如:colou?r表示匹配colour或者color
  •   *与{0,}相同,如:   .*匹配任意内容
  •   +与{1,}相同

此外:

  •   \?\*\+表示匹配字符串“?*+”
  •   [?*+]表示匹配一个?,或者一个*,或者一个+

 

非贪婪匹配

正则表达式“.*”表示匹配双引号,之后是任意内容,之后再匹配一个双引号。

  •   \d{4,5}?表示匹配\d\d\d\d或者\d\d\d\d\d。和\d{4}一样
  •   Colou??r与colou{0,1}r相同,表示找到color或者colour,与colou?r一样
  •   “.*?”表示先匹配一个双引号,然后匹配最少的字符,然后是一个双引号

 

 

选择匹配

用“|”来分隔可以匹配不同的选择

  •   cat|dog表示匹配“cat”或者“dog”
  •   red|blue|或者red||blue或者|red|blue都表示匹配red或者blue或者一个空自负串
  •   a|b|c与[abc]相同
  •   [cat|dog]表示匹配a或者c或者d或者g或者o或者t或者一个分隔符“|”

 

 

分组(用括号表示分组)

  •   (\w*)ility 与 \W*ility相同,都是匹配一个由“ility”结尾的单词
  •   [()]表示匹配任意一个左括号或者一个右括号

分组可以包括空字符串:

  •   (red|blue)表示匹配red或者blue或者是一个空字符串
  •   Abc()def与abcdef相同

在分组的基础上使用重复:

  •   (red|blue)?与(red|blue|)相同
  • l  \w+(\s+\w+)表示匹配一个或多个由空格分隔的单词

 

单次分隔符

  •   \b表示匹配一个单词分隔符
  •   \b\w\w\w\b表示匹配一个三字母单词
  •   a\ba表示匹配两个a中间有一个单词分隔符。这个正则表达式永远不会有匹配的字符,无论输入怎样的文本。

 

单词分隔符本身并不是字符,它的宽度为0

下列正则表达式的作用不同

  •   (\bcat)\b
  •   (\bcat\b)
  •   \b(cat)\b
  •   \b(cat\b)

 

换行符

注意:所有的文本都是以一行结束的,而不是以换行符结束。

  •   ^表示匹配行的开始位置
  •   $表示匹配行的结束位置
  •   ^&表示一个空行
  •   ^.*&表示匹配全为内容,因为行的开始符号也是一个字符,“.”会匹配这个符号。找到单独的一行,可以使用^.*?$
  •   \^\$表示匹配字符串“^$”
  •   [$]表示匹配一个$。但是,[^]不是合法的正则表达式。记住在方括号中,字符有不同的特殊含义,要想在方括号内匹配^,必须用[\^]

与字符分割符一样,换行符也不是字符。它的宽度为0

如下所示的正则表达式作用不同:

  •   (^cat)$
  •   (^cat$)
  •   ^(cat)$
  •   ^(cat$)

 

 

文本 分界

在很多的正则表达式实现中,将^和$作为文本的开始符号和结束符号。

还有一些实现中,用\A和\z作为文本的开始与结束符号

 

 

https://www.cnblogs.com/sthinker/p/6985112.html

  •                    
posted @ 2019-01-10 10:26  肉丝炝锅面  阅读(348)  评论(0编辑  收藏  举报