正则表达式解析

正则表达式解析

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

一.正则表达式的用途

通过使用正则表达式,可以:
1.测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
2.替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
3.基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。

二.正则表达式语法

1.开始之前先观看视频: JS中的正则表达式

2.正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。

表达式 匹配
/^\s*$/ 匹配空行。
/\d{2}-\d{5}/ 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 标记。

3.使用正则表达式

match把所有匹配的东西,全都提取出来。

var str=’abc 234 e45’;

var re=/\d+/g

alert(str.match(re));//234,45

或alert(str.match(/\d+/g));//234,45

replace把所有匹配的东西,全都替换掉。

var str=’abc aaa erw’;

var re=/a/g

alert(str.replace(re,’0’));//0bc,000,erw

4.语法

字符 说明
常用的元字符  
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。在[]中表示取反。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与“\n”或“\r”之前的位置匹配。
常用的反义代码  
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
常用的限定符  

*


零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。

+ 一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。
? 零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。
{n} n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。
{n,} n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效于“o+”。“o{0,}”等效于“o*”。
{n,m} Mn 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。‘o{0,1}‘ 等效于 ‘o?‘。注意:您不能将空格插入逗号和数字之间。
懒惰限定符  
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
分组  
( ) 用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作.
字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
常用分组语法  
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?‘name‘exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
常用的处理选项  
i 匹配时不区分大小写。
g globle进行全局匹配,指匹配到目标串的结尾
m 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)

字符转义

 

\


将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。

JS 中的特殊字符  
$、( )、*、+、.、[ ]、?、\/、^、{ }、| 若要匹配这些字符,请使用 \限定。
优先级顺序(从高到低)  
\ 转义符
(), (?:), (?=), [] 括号和中括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列
| 替换
其他  
(pattern) 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”。
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“or”字符 (|) 组合模式部件的情况很有用。例如,‘industr(?:y|ies) 是比 ‘industry|industries‘ 更经济的表达式。
(?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,‘Windows (?=95|98|NT|2000)‘ 匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
(?!pattern) 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,‘Windows (?!95|98|NT|2000)‘ 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。
x|y 匹配 xy。例如,‘z|food‘ 匹配“z”或“food”。‘(z|f)ood‘ 匹配“zood”或“food”。
[xyz] 字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。
[^xyz] 反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。
\cx 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是“c”字符本身。
\f 换页符匹配。等效于 \x0c 和 \cL。
\n 换行符匹配。等效于 \x0a 和 \cJ。
\r 匹配一个回车符。等效于 \x0d 和 \cM。
\t 制表符匹配。与 \x09 和 \cI 等效。
\v 垂直制表符匹配。与 \x0b 和 \cK 等效。
\xn 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,“\x41”匹配“A”。“\x041”与“\x04”&“1”等效。允许在正则表达式中使用 ASCII 代码。
\num 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。
\nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n m 是八进制数字 (0-7)。
\nml n 是八进制数 (0-3),ml 是八进制数 (0-7) 时,匹配八进制转义码 nml
\un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (?)。

三.实例

正则表达式在线工具:http://www.regextester.com/    http://www.txt2re.com/      http://tool.oschina.net/regex/

1.验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
2.验证电话号码:("^(\\d{3,4}-)\\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
3.验证手机号码:"^1[3|4|5|7|8][0-9]\\d{8}$";
4.验证身份证号(15位或18位数字):"\\d{14}[[0-9],0-9xX]";
5.验证Email地址:("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\.\\w+([-.]\\w+)*$");
6.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+$") ;
7.整数或者小数:^[0-9]+([.][0-9]+){0,1}$
8.只能输入数字:"^[0-9]*$"。
9.只能输入n位的数字:"^\\d{n}$"。
10.只能输入至少n位的数字:"^\\d{n,}$"。
11.只能输入m~n位的数字:"^\\d{m,n}$"。
12.只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
13.只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
14.只能输入有1~3位小数的正实数:"^[0-9]+(\.[0-9]{1,3})?$"。
15.只能输入非零的正整数:"^\+?[1-9][0-9]*$"。
16.只能输入非零的负整数:"^\-[1-9][0-9]"*$。
17.只能输入长度为3的字符:"^.{3}$"。
18.只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
19.只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
20.只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
21.验证是否含有^%&‘,;=?$\"等字符:"[^%&‘,;=?$\x22]+"。
22.只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"。
23.验证URL:"^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$"。
24.验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"10"~"12"。
25.验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"、"10"~"29"和“30”~“31”。
26.获取日期正则表达式:\\d{4}[年|\-|\.]\\d{\1-\12}[月|\-|\.]\\d{\1-\31}日?
评注:可用来匹配大多数年月日信息。
27.匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
28.匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
30.匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
31.匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
33.匹配腾讯QQ号:[1-9][0-9]\{4,\}
评注:腾讯QQ号从10 000 开始
34.匹配中国邮政编码:[1-9]\\d{5}(?!\d)
评注:中国邮政编码为6位数字
35.匹配ip地址:([1-9]{1,3}\.){3}[1-9]。
评注:提取ip地址时有用
36.匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]

-------------------------------------------------------------------------------------------------------------------------------------

转载需注明转载字样,标注原作者和原博文地址。

更多阅读:

https://msdn.microsoft.com/zh-cn/library/101eysae(v=vs.80).aspx

http://www.jb51.net/tools/zhengze.html

时间: 2024-10-25 08:54:15

正则表达式解析的相关文章

&nbsp; linux正则表达式解析

Linux 正则表达式解析 一.Linux文本搜索工具 Linux的文本搜索工具主要有grep,egrep,fgrep.其中grep支持基本和扩展的正则表达式的搜索.egrep支持扩展的正则表达式.fgrep不支持正则表达式的搜索,但是它的搜索速度比较快.这里我们具体探讨一下grep和egrep使用方法. 1.1grep用法 grep [OPTIONS] PATTERN [FILE...] --color={never,auto,always}:是否对搜索到字符串做颜色处理. -o :只显示被模

正则表达式解析 & awk/sed/grep实用实例总结文档

##正则表达式特殊字符解析 "^" 匹配行首 "$" 匹配行尾 "^$" 匹配整行为空,空行 grep -v "^$"    打印非空的行 "."  代表且只能代表任意一个字符 "*" 重复0个或多个前面一个的字符.例如"o*",重复一个或多个o ".*"  匹配所有字符.延伸: "^.*" -->以任意多个字符开头.&q

Android 【山西违章查询实现1】(解析网页源码然后ListView显示出来)---利用正则表达式解析网页源码

这几天学习Android网络方面的,本来想从网上找些违章查询的接口,看了一下基本上都是付费的,索性自己写一个. 主要是 到正则表达式(我都不好意思说我用的正则表达式了)解析了一个网页,然后从ListView显示出来,还有轻量级的SQlite(储存违章查询). 想写一个详细点的所以慢慢来,以后自己回来看的时候估计也会觉得自己写的很乱吧. ---------------------------------- 1.首页查看自己要解析的网页和网址的构成 还需要验证码,最后发现验证码就是骗人的(有点坑啊)

《爬虫学习》(四)(使用lxml,bs4库以及正则表达式解析数据)

1.XPath: XPath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. 工具:扩展商店里搜索:XPath Helper(我是QQ浏览器) XPath的语法: 使用举例: 2. lxml库: lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据 下载:pip install lxml 基本使用:在lxml中使用xpath语法 3.bs4库的使用: 和 lxml 一

Python从零开始写爬虫-2 使用正则表达式解析HTML

上一篇博客Python从零开始写爬虫-1 使用Python发送http请求并获得网页源代码中我们已经学习到如何从网站上获取html的源码, 那么今天我们就来学习如何使用正则表达式来解析HTML.同样以Python的Api文档为例. 正则表达式: 又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规则)的文本.(从百度上复制过来的) 看这篇文章没有正则表达式的基础也可

Java使用正则表达式解析LRC歌词文件

LRC歌词是一种应用广泛的歌词文件,对其进行解析时 标准格式: [分钟:秒.毫秒] 歌词 1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.InputStreamReader; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.Li

提取网页地址时的正则表达式解析

在分析网址中的图片的地址时,会用到如下正则表达式: src="(.+?\.jpg)" 其中".+?"一直不太明白,"."符号匹配任意字符,"+"匹配1或多次,后面再跟问号却不明白什么意思,后台再去看正则表达式,才发现是懒惰模式,及匹配最少次数. 例如: 要匹配文本 <img class="BDE_Image" src="http://imgsrc.baidu.com/forum/w%3D58

正则表达式解析url参数

解析url参数正则:(?<=\?|&)[\w\={},:''""]*(?<=[^#]) 正好项目中要用到 捣鼓了好久还是不会.最终放弃使用split分割的方式解析发现好落伍 public static NameValueCollection QueryString(string path) { if (string.IsNullOrEmpty(path)) { return null; } var arr=path.Split(new char[] { '?' },

python正则表达式解析(re)

正则表达式的使用方法主要有4种: re.search(进行正则匹配), re.match(从头开始匹配)  re.findall(找出所有符合条件的字符列表)  re.split(根据条件进行切分)  re.sub(根据条件进行替换) 匹配规则里的符号 # . 可以被当作任意字符, re.M 忽略开头的换行符 res = re.match('^c.+\d', 'cheng123ronghua', flags=re.M) print(res) # ^ 匹配当前字符串的开头, ^c表示已c开头,a$