正则表达式快速通
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} |
重复n到m次 |
表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,匹配dancing的danc
(?<=exp)意思 自然就是 要前面跟着exp了.如 (?<=\bre)\w+\b 匹配rebuild中的build
(?!exp)意思 就是后面不能是 exp了
(?<!exp)意思就是 前面不能是exp了
至此 ,如果你掌握了这些东西 ,那的正则表达式已经入门了,有没有感觉也不是那么的难呢.
注:文章来源于网络,如有异议,请联系我删除!
以上是关于正则表达式快速通的主要内容,如果未能解决你的问题,请参考以下文章