一、为什么大家都不喜欢用正则表达式
正则表达式,又称规则表达式,是计算机科学的一个概念,这个概念最初是由Unix中的工具软件普及开的。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。正则引擎主要分为DFA、NFA两大类。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。
正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
大多数人不喜欢它,他们不理解它,不使用它,不写规则化,很难写出准确,有效的规则化。
不需要更多,也不需要更好的解决方案。
出于对“规则”这个词的恐惧,许多人第一次听到这个名字是一件很奇怪的事情。
它似乎是一个乱七八糟的字符串,
看起来头晕,而且没有学习的欲望。
很多的规则不仅看起来很奇怪,而且还有两个常规引擎DFA,NFA,还有更多的类型,例如PCRE、位置/gnu BRE、位置/gnu ERE,特别是操作的同事,发现可以在grep下正常匹配时,awk无法正常匹配。
DFA引擎的mysql、Java、flex、awkNFA引擎的perl、Java、grep、更多、vi、PHP(在旧版本的PHP中,有三个类库),DFA NFA引擎混合在TCL语言中。
大部分的工作不被使用,很少被使用,因此也懒得去学习。
这两个函数主要解决以下问题:冗长的表达式结构。
当匹配一种复杂的格式时,所使用的表达式不仅单调乏味,而且还晦涩难懂,它可以在不小心更改符号的情况下进行更改。
无限级多重替代功能将极大地改善这种情况。
可以将替换工作分解成几个步骤,这些步骤可以单独处理,使思路清晰,表达式易于维护。
不可能完成的任务。
正则表达式是通用的,有很多格式是不可能的或者很难使用表达式来完成的,很多时候我们需要编写一个新的程序来解决,引用函数时,很多问题都被解决了。
参考其替代的结果,这是非常有用的在处理复杂的格式。
二、js使用正则表达式将字符串里面的img标签src的值提取出来
我看很多做前端的朋友,基本上都会碰到这个问题。比如,前端页面上要动态显示从后台接口返回的一串包含【DOM】节点的字符串。但是呢?有时候后台返回的这段字符串里面有个<img src="" alt=""/>标签,而页面上图片因为地址原因又显示不出来,所以有时候就会有这么个需求,需要匹配到这段字符串里面的【img】标签,拿到它的【src】属性,可能会做判断可能会直接修改。
let reg = /(\/|http)[^>]+\.(jpg|jpeg|png|gif)/g;
这个正则的适用以下场景,如下:
一、带返回http或者https开头的链接。(<img src=""/>);
二、直接返回服务器图片存储路径。(<img src="/upload/downFile/catalogue/baidu.jpg"/>);
let str='<div style="text-align: center;"><img alt="" src="/rooufiles/gather/A/ADMIN/1585793229899nhWuXs.jpg" /><br /></div><img alt="" src="" />甜粄是一道美味可口的传统小吃,属于客家菜。主要食材有糯米、砂糖等制成。<br />'
str.match(reg)
第二种,就是利用我们JS的DOM节点操作去获取。
比如后台返回的是这样的一串字符串;
let str='<div style="text-align: center;"><img alt="" src="/rooufiles/gather/A/ADMIN/1585793229899nhWuXs.jpg" /><br /></div><img alt="" src="" />甜粄是一道美味可口的传统小吃,属于客家菜。主要食材有糯米、砂糖等制成。<br />'
我们可以先创建一个临时节点;
let tempDom= document.createElement('div');
然后将创建的节点填充;
tempDom.innerHTML= tempDom;
然后获得创建的临时节点下面所有的img标签;
let imgs= tempDom.querySelectorAll('img');
再利用数组的方法去遍历;
[].map.call(imgs,function(img){console.log(img.src)});
这样就可以拿到了img的值,并且可以去修改;
同样的取一下 tempDom.innerHTML的值就好了。
三、正则匹配 ABBA 格式
后台回复“666”领取资料一份
/1前言/
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。在这篇文章之前,小编整理过Python正则表达式系列文章,如下所示:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
这次给大家主要是介绍Python中的正则表达式,及其相关函数的基本使用方法,并且捎带一些正则表达式给我们带来的便利。
/2简介/
Python自1.5版本起增加了re模块,它提供 Perl风格的正则表达式模式。re模块使得Python语言拥有全部的正则表达式功能。
compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
/3 re.match函数/
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。语法如下所示:
re.match(pattern, string, flags=0)
“pattern”匹配的正则表达式“string”要匹配的字符串“flags”标志位。
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num)或 groups()匹配对象函数来获取匹配表达式。
group(num=0)匹配的整个表达式的字符串,“group()”可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
下图是个实际例子:
输出结果如下图所示:
/4检索和替换/
Python的re模块提供了re.sub用于替换字符串中的匹配项。语法如下所示:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
pattern:正则中的模式字符串。
repl:替换的字符串,也可为一个函数。
string:要被查找替换的原始字符串。
count:模式匹配后替换的最大次数,默认 0表示替换所有的匹配。
flags:编译时用的匹配模式,数字形式。
前三个为必参数,后两个为可选参数。
下图是个实际例子:
输出结果如下图所示:
/5 compile函数/
compile函数用于编译正则表达式,供match()和 search()这两个函数使用。语法格式为:
re.compile(pattern[, flags])
参数:
pattern:一个字符串形式的正则表达式
flags可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
re.I忽略大小写
re.L表示特殊字符集\w,\W,\b,\B,\s,\S依赖于当前环境
re.M多行模式
re.S即为'.'并且包括换行符在内的任意字符('.'不包括换行符)
re.U表示特殊字符集\w,\W,\b,\B,\d,\D,\s,\S依赖于 Unicode字符属性数据库
re.X为了增加可读性,忽略空格和'#'后面的注释
/6正则表达式对象/
re.RegexObject:re.compile()返回RegexObject对象。
re.MatchObject:group()返回被 RE匹配的字符串。
start()返回匹配开始的位置
end()返回匹配结束的位置
span()返回一个元组包含匹配(开始,结束)的位置
/7正则表达式修饰符-可选标志/
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|)它们来指定。如 re.I| re.M被设置成 I和 M标志:
re.I
使匹配对大小写不敏感
re.L
做本地化识别(locale-aware)匹配
re.M
多行匹配,影响 ^和$
re.S
使.匹配包括换行在内的所有字符
re.U
根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B.
re.X
该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
/8正则表达式模式/
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠进行转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于\\t)匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
正则表达式实例
字符匹配
实例
描述
python
匹配"python".
字符类
/9实际应用/
以猫眼电影为例。我们需要获取(电影的名字作者,上映时间)等等都可以用正则表达式来解析。
可以看到我们要的名字在一个a里面,而他们被一个div包裹着。
我们把div想象成一个盒子,可以看到div里面还有一个div我们可以先找他上面一层的div是一个表单
再找到它的上一层的盒子div
一般来说我们找到前两层就可以找到我们要的结果。如果不对就再找几层。
分析完再实际操作一下:
pattern= re.compile('
.*?title="(.*?)".*?class="star">(.*?)
.*?releasetime">(.*?)
',re.S)
(.*?)表示我们要的内容
(.*?)
里面的主演也是我们要的这样我们就可以得到我们想要得多个数据。
/10小结/
1.正则表达式适合一些需要获取多个数据的场景。它能够以更快捷的方式去获取到我们想要的数据。
2.本文主要介绍了正则表达式,及其基本用法,具体每个字符的用法,可以参考前言里边的正则表达式系列文章,希望能够帮助大家更好的了解正则表达式的用法。
3.想学习更多关于Python的知识,可以参考学习网址:
四、JavaScript正则表达式中*********是什么意思
“?:”是“非获取存储匹配”的意思
“?:”只在一个“()”group中,紧贴着“(”出现,例如“(?:abcdefg)”,不同于“?”,“?:”不是一个量词,但是与“()”共同构造一个元字符,这个元字符所匹配出来的结果,不会保留,也不能参与诸如替换计算等等的操作。(这个操作在服务端多见一些,前端用的不多)(javascript只有string对象的replace方法能用到这个功能)
简单来说,就是你的正则表达式如果用不着在javascript里面使用replace方法,“?:”就可以省去(当然,看个人喜好和排版习惯,还有调试中的页面响应速度,如果加了“?:”反而更快,那就用吧)。
这么说起来还是比较抽象,用实例代码来说明吧。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<p>将匹配的数字增加后缀“9”</p>
<p class="demo">/(\d+)/gi:A23G4HFD567.</p>
<p class="demo">/(?:\d+)/gi:A23G4HFD567.</p>
<button onclick="myFunction()">点我</button>
<script>
function myFunction(){
var e=document.getElementsByClassName("demo");
var str=e[0].innerHTML;
var n=str.replace(/(\d+)/gi,"$19");
e[0].innerHTML=n;
str=e[1].innerHTML;
var n=str.replace(/(?:\d+)/gi,"$19");
e[1].innerHTML=n;
}
</script>
</body>
</html>
<!---->
<!--在实例里面“$1代表第一个“()”所匹配的结果-->
点击“点我”按钮前
点击“点我”按钮后
可以看到“/(\d+)/gi”所匹配的结果被用于扩展替换字符串中的“$1”;
但是“/(?:\d+)/gi”所匹配的结果没有被用于扩展替换字符串中的“$1”,尽管,它也成功地找到了被查找字符串中的数字,显然结果没有被保留。
对了,类似的问题,可以用这种办法去对比验证。(比如“?=”、“?!”、“?<=”、“?<!”是什么意思……)
上图是在菜鸟教程找到的一个比较全面的正则表达式的元字符列表的部分:
还有,不同软件的正则表达式的可能有不同的特性,但是目前perl的正则表达式是公认最多特性的。