正则表达式快速通

Posted BYITTD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式快速通相关的知识,希望对你有一定的参考价值。



正则表达式到底是什么东东(what)



俩句话


1. 正则表达式 是用于描述字符串规则的工具

2. 正则表达式是记录文本规则的代码, 能被java js运行环境 识别解读。 


正则表达式有什么用(why)



正则表达式能被java js运行环境 识别解读,于快速在 大文本 定位 匹配 替换 查找出所有的符合正则表达式描述规则字符串。可以这么说,正则表达式是处理字符串,大文本字符串的利器.所以掌握正则表达式是一个合格的程序员应该具备的技能

 

正则表达式怎么用(how)



一个东西的最好方法是从日常的需求,一个例子开始,然后步步升华深入。


假设你在一篇英文小说里查找 hi ,你可以使用正则表达式 hi

 

,这简单的俩个字母就可以是一个正则表达式.

 

这几乎是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i

 

但是现在 如果我想不区分大小写的匹配hi,HI,Hi,hI,怎么办?

 

好办 ,通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它就可以匹配hi,HI,Hi,hI这四种情况中的任意一种了。

 

不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们需要这样来写 \bhi\b

 

\b正则表达式规定的一个特殊代码,代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

 

假如你要找的是hi后面不远处跟着一个Lucy,你要这样 \bhi\b.*\bLucy\b

 

这里,.是另一个元字符,匹配除了换行符以外的任意字符。*同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。现在\bhi\b.*\bLucy\b的意思就很明显了:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词。

 

到这里.我们可以总结出这样的东西也可以说我们明白这样一个问题:

正则表达式 , 俩部分组成

1 我们自己原始的字符,  代表他本来的意思  abc 代表 abc

2 正则表达式系统 规定的字符 往往不代表本身的意思 人们给这种字符起名为元字符 

例如 \b代表斜线和一个b 而是代表一个单词的开始结尾,代表一个位置  

例如 . 这个. 不代表一个. 而是代表除换行符以外的任意字符

例如 * 不代表 *  而是代表前面的内容可重复任意个数量

那么到这里你可能,那如果我就是要表示一个.*怎么办呢,正则表达式规定,如果你要表示这些,你需要\.\*,要查找\本身,你得用\\

 

俩部分, 所以学 正则表达式  不难 ,无非就是们要记住一个 正则表达式规定的字符, 然后灵活运用就好了

 

所以你需要背下下面 常用元字符 

 

1.常用的元字符

代码

说明

.

匹配除换行符以外的任意字符

\w

匹配字母或数字或下划线或汉字

\s

匹配任意的空白符

\d

匹配数字

\b

匹配单词的开始或结束

^

匹配字符串的开始

$

匹配字符串的结束

 

   

2.常用的代表数量的限定符

代码/语法

说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n

{n,}

重复n次或更多次

{n,m}

重复nm

  

 

3.常用的反义代码

代码/语法

说明

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配不是单词开头或结束的位置

[^x]

匹配除了x以外的任意字符

[^aeiou]

匹配除了aeiou这几个字母以外的任意字符

 

几个特殊的正则规则

 

1. 假如我要表示多个中的任意一个怎么表示 ?

:用中括号[],例如[ab]c 表示ac bc

2. A*表示任意多个A ,如果我要表示 任意多个abcd进行重复怎么办 ?

:使用(),(abcd)*,明白了吗()代表括号里面的内容是一个整体.

3. 假如我要表示abcd或者1234 怎么 ?

:  使用| , abcd|1234 ,|代表或  

 

4. 假如我要查找文章所有重复词语 go go ,bye bye,这样重复的?

:  我们当然不可以写 \b\w+\b\s+\b\w+\b,相信你也可以理解什么可以这样写.简单因为这样写匹配不了重复.

要如何写呢? 这样 \b(\w+)\b\s+\1\b 没错,

现在解释一下 正则表达式里规定  凡是()括起来的表达式 被分到一个组里,这个组有个组号. 整个正则表达式左往右 第一个左括号到的组号是1 ,第二个分到的组号是2 ,依次类推,最大到9 .如果要对这个 进行重复只要使用 \加上组号即可.这里 \b(\w+)\b\s+\1\b 明白了吧  


5. 假设一个字符串100000090000009, 假如我要取1 第一个9 之间的内容,想一想,我们该怎么玩呢?

: 我们可以写作1\d+9?告诉,如果你这样写,匹配出的100000090000009 ,为什么会这样呢,因为条件符合时正则表达式默认会尽可能多的匹配结果.  如果我们要改变这种默认,怎么玩呢.这里我们要表示量词的+后面加个问号,1\d+?9 ,这样系统会尽可能少的匹配结果集.我们就拿到我们想要的结果了. 

 

重要 : 正则表达式解析的时候  左至右  解析

  

进阶

正则表达式的断言

 

零宽断言

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp后面的位置

(?!exp)

匹配后面跟的不是exp的位置

(?<!exp)

匹配前面不是exp的位置

这几个表达式 它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言)  

(?=exp) 意思是 ,要后面跟着exp算匹配上了, \b\w+(?=ing\b) 匹配reading read,匹配dancingdanc

(?<=exp)意思 自然就是 前面跟着exp. (?<=\bre)\w+\b 匹配rebuildbuild

(?!exp)意思 是后面不能是 exp

(?<!exp)意思就是 前面不能是exp

 

至此 ,如果你掌握了这些东西 ,正则表达式已经入门了,有没有感觉也不是那么的难呢.


注:文章来源于网络,如有异议,请联系我删除!


以上是关于正则表达式快速通的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式快速处理微信聊天记录

通过从文件中读取来提升正则表达式匹配

不会吧,不会吧,还有人不会正则|快速入门正则表达式|常用的举例

正则表达式常用语法一览

正则表达式快速入门,转载

正则表达式语言 - 快速参考