关于正则表达式:Redis的底层类型之geo

geoGEOADD GEOADD key [NX | XX] [CH] longitude latitude member [longitudelatitude member ...]key:指定要增加地理信息的有序汇合的键名。 longitude 和 latitude:示意地理位置的经度和纬度。通常应用双精度浮点数示意。 member:与地理位置相关联的成员名称。 GEODISTGEODIST key member1 member2 [unit]key:指定要查问地理位置信息的有序汇合的键名。member1 和 member2:示意两个地理位置成员的名称,用于计算它们之间的间隔。unit(可选):指定间隔的单位,默认为米(m)。你能够应用以下单位之一:米(m)、千米(km)、英里(mi)或英尺(ft)。 GEOHASHGEOHASH key member [member ...]GEOHASH 是 Redis 用于获取指定地理位置成员的 Geohash 值的命令。Geohash 是一种用于将地理位置坐标编码为字符串的办法,能够用来示意地理位置的精度和范畴。 GEOPOSGEOPOS 是 Redis 用于获取指定地理位置成员的经纬度坐标的命令。 GEORADIUSGEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]key:蕴含地理位置信息的有序汇合的键名。longitude:查问中心点的经度。latitude:查问中心点的纬度。radius:查问半径范畴,以间隔单位(m、km、ft、mi)为单位。[WITHCOORD]:可选参数,返回成员的经纬度坐标。[WITHDIST]:可选参数,返回成员与查问中心点的间隔。[WITHHASH]:可选参数,返回成员的哈希值。[COUNT count]:可选参数,限度返回的成员数量。[ASC|DESC]:可选参数,指定返回后果的排序程序。[STORE key]:可选参数,将后果保留到指定的键名中。[STOREDIST key]:可选参数,将后果保留到指定的键名中,并蕴含成员间隔信息。GEORADIUS 是 Redis 用于执行地理位置范畴查问的命令。它容许你查找指定地理位置汇合中,间隔给定坐标点肯定范畴内的成员。 GEORADIUS_ROGEORADIUS_RO 是 Redis 的一个扩大命令,通常用于在进行只读的地理位置查问时应用。与规范的 GEORADIUS 命令相比,GEORADIUS_RO 具备以下特点: 只读操作:GEORADIUS_RO 是只读操作,不会对 Redis 的数据集产生写入影响。 ...

September 25, 2023 · 1 min · jiezi

关于正则表达式:JAVA中正则表达式的应用-javautilregex篇

当初JDK1.4里有了本人的正则表达式API包,JAVA程序员能够免去找第三方提供的正则表达式库的周折了,咱们当初就马上来理解一下这个SUN提供的迟来恩物- -对我来说的确如此。 1.简介:java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包含两个类:Pattern和Matcher一个Pattern是一个正则表达式经编译后的体现模式。一个Matcher对象是一个状态机器,它根据Pattern对象做为匹配模式对字符串开展匹配查看。 首先一个Pattern实例订制了一个所用语法与PERL的相似的正则表达式经编译后的模式,而后一个Matcher实例在这个给定的Pattern实例的模式管制下进行字符串的匹配工作。以下咱们就别离来看看这两个类: 2.Pattern类:Pattern的办法如下:static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类static Pattern compile(String regex, int flags) 同上,但减少flag参数的指定,可选的flag参数包含:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQint flags() 返回以后Pattern的匹配flag参数.Matcher matcher(CharSequence input) 生成一个给定命名的Matcher对象static boolean matches(String regex, CharSequence input) 编译给定的正则表达式并且对输出的字串以该正则表达式为模发展匹配,该办法适宜于该正则表达式只会应用一次的状况,也就是只进行一次匹配工作,因为这种状况下并不需要生成一个Matcher实例。String pattern() 返回该Patter对象所编译的正则表达式。String[] split(CharSequence input) 将指标字符串依照Pattern里所蕴含的正则表达式为模进行宰割。String[] split(CharSequence input, int limit) 作用同上,减少参数limit目标在于要指定宰割的段数,如将limi设为2,那么指标字符串将依据正则表达式分为割为两段。一个正则表达式,也就是一串有特定意义的字符,必须首先要编译成为一个Pattern类的实例,这个Pattern对象将会应用matcher()办法来生成一个Matcher实例,接着便能够应用该 Matcher实例以编译的正则表达式为根底对指标字符串进行匹配工作,多个Matcher是能够共用一个Pattern对象的。 当初咱们先来看一个简略的例子,再通过剖析它来理解怎么生成一个Pattern对象并且编译一个正则表达式,最初依据这个正则表达式将指标字符串进行宰割: import java.util.regex.*;public class Replacement{ public static void main(String[] args) throws Exception { // 生成一个Pattern,同时编译一个正则表达式 Pattern p = Pattern.compile("[/]+"); //用Pattern的split()办法把字符串按"/"宰割 String[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film." +"/ 凯文曾经看过《这个杀手不太冷》几次了,因为它是一部" +"好电影。/名词:凯文。"); for (int i=0; i<result.length; i++) System.out.println(result[i]); }}输入后果为: ...

May 5, 2023 · 3 min · jiezi

关于正则表达式:用这个正则校验密码真的可以吗

问题背景最近帮共事解决了一个正则问题,挺有意思,分享给大家 背景是共事在做一个用户注册相干的性能,甲方提出了一些对明码复杂度的要求,要求长度8-32位,小写字母,大写字母,数字,符号四种必须都有,上面是匹配明码的最后的正则表达式 (?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,32}问题验证大家能够看一下这个正则,感觉一下用这个正则可能满足下面的明码校验要求吗?能够花一点工夫想一想 答案是:不能 咱们来做个简略的测试,倡议找一个在线工具,理论测试一下 把表达式输出进去,咱们测如下几段文本 abc123A:没有匹配,长度不够abcd12345:没有匹配,复杂度不够,没有大写和符号abcdA123-:可能失常匹配,长度合乎,复杂度合乎那这不是阐明这个正则是OK的吗?咱们再测上面这个文本 abcdA123-我:这怎么也匹配了abc他dA★123:这怎么也匹配了问题改良这个正则外面有两个小问题 符号限定过于宽泛:(?=.*[^a-zA-Z0-9])这个判非就把其余所有字符都囊括进来了没有输出文本的限定:.{8,32}这个点也囊括了除换行以外的所有字符针对下面两个问题改良一下这个正则,首先要枚举咱们容许呈现的符号,假如咱们只容许呈现 “-_” 这两个字符 改良后的正则如下 ^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[-_])[0-9a-zA-Z-_]{8,32}$这个问题一方面是不足测试验证,但更深层的起因其实是对正则不够理解,不能疾速发现正则的问题,下一节咱们就来看看这个正则外面比拟艰难的局部 扩大浏览可能有同学有疑难后面这么一大堆括号是干什么的 这里温习一下正则表达式的一个根底概念:零宽断言 零宽断言是一种零宽度的匹配,它匹配到的内容不会保留到匹配后果中去,最终匹配后果只是一个地位而已。 (?=)就是一种零宽断言,叫做正向后行断言,次要作用是匹配表达式前面的内容 比方:\d(?=px),这个正则能匹配到1px中的1,不会匹配到2pm中的2,因为2前面跟的不是px,如果想同时把px也匹配上,那就得写\d(?=px)px,这看起来就跟\dpx一样了,在匹配单个条件的时候确实没有区别,但匹配多条件的时候就不一样了 咱们还是用例子来解释一下 [a-z0-9]{4,10}这样一个正则能示意英文小写和数字呈现4-10次,但不能要求必须同时有英文和数字,能够是纯英文,也能够是纯数字 正则是一种程序性的描述性语言,1a和a1是不同的,如果想形容这种不确定地位的组合,对于一般正则写法来说是比拟艰难的,根本就变成了排列组合了 这时咱们就能够通过正向后行断言来帮忙进行匹配,正向后行断言能够了解成对字符串的模式匹配 (?=.*[a-z])示意前面必须呈现一个英文小写,然而地位能够不定,应用.*来表白地位不定这个信息同理(?=.*[0-9])示意前面必须呈现一个数字,然而地位能够不定[a-z0-9]{4,10}限定输出内容和长度(?=.*[a-z])(?=.*[0-9])[a-z0-9]{4,10}连贯在一起就能示意英文小写和数字呈现4-10次,且英文和数字都必须至多呈现一次

April 2, 2023 · 1 min · jiezi

关于正则表达式:正则表达式那些事基础篇

基本概念正则表达式中的元素由字符和元字符组成。字符又叫做一般字符即一般的计算机编码,如咱们罕用的英文字符、数字、中文等等;元字符又被称为特殊字符即在正则表达式中存在非凡意义的字符,如\、*、$等等,详情可见MDN 文档。 精准匹配正则表达式与指标字符一对一匹配。波及:\当咱们想匹配a字符,正则表达式能够间接写成/a/。然而匹配的是元字符时,如$,间接写成/$/是无奈匹配到胜利的,因为$在正则中存在非凡意义,此时咱们须要应用\对元字符进行本义,即打消元字符的非凡意义,要想匹配$可写成/\$/。个别一般字符在\的润饰下也会领有非凡含意,如\n(换行)、\r(回车)等等。 ✒ 小结:匹配一般字符:/一般字符/;匹配元字符:/\元字符/;匹配特定字符:/\个别一般字符/。 正则表达式形容&举例关联/一般字符/匹配一般字符-/\元字符/匹配元字符-/\n/匹配换行符(LF)换行和回车/\r/匹配回车符(CR)换行和回车/\f/匹配换页符-/\t/匹配制表符(Tab)-/\v/匹配垂直制表符-多字匹配正则表达式之所以弱小,就是其能进行含糊匹配。应用汇合、区间和通配符的形式实现一对多的匹配,实现字符含糊。波及:[]、-、通配符汇合如果咱们想同时匹配 1 到 9 之间全副的奇数,如果应用精准匹配必定无奈满足以后的要求,此时咱们能够应用用汇合的形式来解决,应用[]元字符将须要匹配的字符全副列举进去,这时的正则能够写成/[13579]/; /[13579]/.test("1"); // true/[13579]/.test("2"); // false区间当咱们想要同时匹配大于 4 的数字时,应用汇合的形式能够写成/[56789]/,看着其实还好,然而如果要求同时匹配全副小写字母呢,全副列举进去必定是不迷信的,这时咱们须要想到区间的写法。当咱们想要同时匹配一段间断的数字、字母或者中文时咱们能够应用区间的写法,上述问题能够写成/[5-9]/。 /[a-z]/:同时匹配所有小写字母;/[\u4e00-\u9fa5]/:同时匹配全副汉字;/[\u4e00-\u9fa5]/.test("我"); // true/[\u4e00-\u9fa5]/.test("I"); // false通配符在开发中时常会遇到仅容许用户输出数字的场景,用区间形式可写成/[0-9]/,然而区间的写法相对来说还是比拟低效,所以正则提供更简便的写法:通配符写法,应用\d通配符即可同时匹配 0 至 9 的数字,所以懈怠才是人类文明提高的真正能源呀; /\d/.test("1"); // true/\d/.test("壹"); // false汇合、区间和通配符并不是水火不容的,当他们同时存在时会取它们的并集,现想同时匹配全副数字、全副小写字母以及_,可间接写成/[\da-z_]/ /[\da-z_]/.test("a"); // true/[\da-z_]/.test("A"); // false✒ 小结:汇合写法:/[列举字符]/;区间写法:/[开始-完结]/;通配符写法:/通配符/。 正则表达式形容&举例关联/[13579]/[]列举的全副字符-/[5-9]/[]内区间的全副字符-/\d/0 至 9 之间的字符等价于[0-9]/\D/0 至 9 以外的任何字符等价于 [^\d]/\w/0 至 9、a 至 z、A 至 Z 以及\_等价于 [a-zA-Z_\d]/\W/0 至 9、a 至 z、A 至 Z 以及\_以外字符等价于 [^\w]/\s/全副空白字符,如:<br/>空字符、\n、\r、\f、\t、\v等价于[\n\r\f\t\v ]/\S/全副非空白字符等价于[^\s]/./除\n 和\r 以外的全副字符等价于[^\n\r]次数限定依据多字匹配一节咱们写成的正则能够匹配某一类字符,然而匹配的长度仍然是固定的,本节就来讲讲设置字符反复的次数,实现长度含糊。波及:?、{}、*、+?元字符咱们常见的传输协定有两种:http 和 https,如果咱们现想写一个同时匹配这两种协定的正则该如何写呢?剖析一下需要:http 后有没有 s 都能匹配胜利,这时咱们能够应用?这一元字符润饰s,示意s可匹配 0 次或者 1 次。正则能够写成/https?/。 ...

March 16, 2023 · 3 min · jiezi

关于正则表达式:10分钟入门想学爬虫关于正则表达式看这一篇就够了

最近接触到正则表达式,用于匹配对应的字符串,感觉很神奇,于是开始一个学习。 有句老话说得好:“爬虫写得好,牢范吃得饱。”哈哈哈当然是开个玩笑。工具举荐regex101: build, test, and debug regex这个网站能够帮忙咱们实时地测试RegExp(正则表达式),前面的教程都在这个平台上进行。 RegEx中各种符号的用法要学习RegEx首先要学会各种符号的用法。 1.限定符限定符仅作用与右边一个字符,或右边的一块表达式。 ? 示意能够呈现0次或1次,也就是可有可无+ 示意能够呈现1次或屡次* 示意能够呈现任意次{x} 示意必须呈现x次,{l, r} 示意呈现次数必须在闭区间[l, r]之间,能够省略一个,下界默认为0,上界默认无穷如果我要在一些字符中找出以a结尾,以c结尾,两头有若干个b的字符串,能够像上面这样写: 也能够这样写: 不难发现,后面的这些?+*都能够用{}来表白,不过为了不便就会用后面的示意。 2.“或”运算在简直所有编程语言中都有或运算来示意一个不太好一步示意的逻辑汇合,在RegExp中也能够。 符号:| 能够将左右两个表达式取并集作为新的表达式,但优先级低于表达式的拼接 比方我要失去所有的a和an,就能够像上面这样写。留神两边要用括号和\b包围起来,\b确保这是一个单词而不是一个单词的一部分,括号是为了避免把"\ba"和"an\b"作为两个表达式,咱们的表达式应该是a和an。 3.字符类格局:[abc]示意这一位能够是abc中的任意字符,也能够用区间来示意,比方[a-z]示意这一位能够是一个小写字母,[a-zA-Z0-9]+示意这里能够是一个或多个“大写字母或小写字母或数字”。 举个例子,我要匹配所有格局为"班级+学号"中找出所有zy02班的人,能够像下图这样做。 如果要找出所有jsj1班到3班的,能够像上面这样做。 这里的\d和[0-9]等价。值得注意的是这里的非法学号jsj0100没有被匹配到。 也能够在 [ ] 的结尾增加一个 ^ 字符,示意排除。 4.元字符\d 示意数字\D 示意非数字\w 示意字母、数字和下划线\W 示意非字母、数字和下划线\s 示意空白字符\S 示意非空白字符^ 匹配行首$ 匹配行尾5.贪心匹配与懈怠匹配RegExp默认匹配模式为贪心匹配,也就是尽可能长。 如果我在一段HTML中想要匹配出每一个<>标签,如果像上面这样写,会把整个文档作为一个长字符串匹配。 这显然不是咱们想要的后果,咱们就能够利用?来改为懈怠匹配。 修饰符援用一段菜鸟教程的文章《正则表达式 – 修饰符(标记) | 菜鸟教程》,间接偷懒一手。 个别会用/g,示意global全局搜寻。 在Python中应用RegExpython须要先引入re库,这是一个很弱小的字符串匹配库。 咱们利用re.search(pattern, string[, flags])来做匹配,会返回一个后果组成的元组,如果没找到返回None,罕用于判断。 如果我要在python中辨认一段式子是一个正数,还是一个表达式时,能够这样匹配: 再举个例子,如果我要在一段html中找出所有a标签,能够像上面这样做,,re.findall返回一个list。 本文完结啦,感激大家的浏览,如果本文对你有用的话欢送点赞珍藏和关注!

March 16, 2023 · 1 min · jiezi

关于正则表达式:正则表达式是如何运作的

本文作者:时浅写在后面在日常的开发工作当中,咱们必不可免的会碰到须要应用正则的状况。 正则在很多时候通过不同的组合形式最初都能够达到既定的指标后果。比方咱们有一个须要匹配的字符串:<p>hello</p>,咱们能够通过 /<p>.*<\/p>/ 以及 /<p>.*?<\/p>/ 来匹配,两种形式就像就像中文语法中的陈述句以及倒装句,不同的语序往往不影响咱们的了解,然而他们的运作形式却齐全不一样。 为了让大家有一个更加直观的感触,这里将 <p>hello</p> 分三次存到一份百万字符文档的最后面,两头以及最初面,而后别离应用下面的 2 个正则表达式进行匹配,并测算匹配到对应字符所须要的工夫,后果如下(试验后果通过 https://regexr.com/ 得出): 最后面两头最初面/<p>.*<\/p>/1.1ms0.7ms0.2ms/<p>.*?<\/p>/0.1ms0.2ms0.3ms由此咱们能够显著地看出不同的撰写形式,匹配的效率也有很大的不同。 撰写正则是一个一直思考与抉择的过程。就像一道数学题中往往蕴含一种或几种最优解的可能,想要趋近这个后果,就须要咱们理清题意,把握正则的表达方式以及增强对正则运作形式的了解。 那么,咱们应该如何趋近最优解,养成良好的撰写习惯,锤炼撰写强壮的正则表达式的能力呢? 知己知彼,百战不殆,要写好正则表达式就须要做到知其然还要知其所以然。因而,本文将尝试从正则原理的角度登程,介绍正则匹配的规定,梳理正则与无限自动机的关系、及无限自动机之间的转化逻辑,并解释回溯等相干概念。心愿可能帮忙大家更好地了解及应用正则。 正则表达式与无限自动机(FA)正则表达式是建设在 无限自动机 ( Finite Automaton ) 的实践根底上的,是自动机实践的利用。当咱们写完相干的表达式之后,正则引擎会依照咱们所写的表达式构建相应的自动机,若该自动机承受输出的文本并到达最终状态,则示意输出的文本能够被咱们所写的正则表达式匹配到。 无限自动机的图示自动机的图形化蕴含以下元素: 箭头:示意门路,能够在下面标注字母,示意状态 1 通过该字母能够转换到状态 2 (也能够是标注 ,即空串,示意无需通过转换就能够从状态 1 过渡到状态 2),单圆圈:示意非完结的中间状态双圆圈:示意完结状态由本身指向本身的箭头:用于示意 Kleene 闭包(也就是正则表达式中的 *),指能够走任意次数的门路。以 ab*c 这条正则表达式为例,其无限自动机的图示如下,示意状态 1 通过 a 能够过渡到状态 2 ,在状态 2 能够通过 再循环通过 b 也能够不通过 b 而间接通过通过 再经由 c 过渡到最终的完结状态。 不确定无限自动机(NFA)及确定无限自动机(DFA)无限自动机又能够分为 NFA:不确定无限自动机(Nondeterministic Finite Automaton )及 DFA:确定无限自动机(Deterministic Finite Automaton ),NFA 的不确定性体现在其状态能够通过 转换 以及对同一个字符能够有不同的门路。而 DFA 能够看作是一种非凡的 NFA,其最大的特点就是确定性,即输出一个字符,肯定会转换到确定的状态,而不会有其余的可能。 ...

February 23, 2023 · 4 min · jiezi

关于正则表达式:正则表达式判断是否可转为数值是否有首尾空格

是否为可用数值(验证输出是否为一个数值型,能够在类型转换后进一步的运算):const numericalReg = /^-?([1-9][\d]{0,7}|0)(\.[\d]+)?$/;//{0,7}限度8位console.log(numericalReg.test(001230))//trueconsole.log(numericalReg.test(33))//trueconsole.log(numericalReg.test(-33))//trueconsole.log(numericalReg.test('-0.33'))//trueconsole.log(numericalReg.test('0'))//trueconsole.log(numericalReg.test(0.12))//trueconsole.log(numericalReg.test(NaN))//falseconsole.log(numericalReg.test(12345678))//trueconsole.log(numericalReg.test(123456789))//falseconsole.log(numericalReg.test('12s'))//falseconsole.log(numericalReg.test(''))//false是否有首尾空格(个别为校验输入框的内容有效性,相似trim):const trimReg = /^\S.*\S$|(^\S{0,1}\S$)/;console.log(trimReg.test('123'))//trueconsole.log(trimReg.test(' 123 '))//false

January 21, 2023 · 1 min · jiezi

关于正则表达式:百度工程师带你玩转正则

作者 | 背阴 导读 在很多技术畛域,都有正则的身影。但许多像我一样的人,只闻其名。因而将正则罕用常识汇总,便于查阅。正则表达式(Regular Expression)是用于形容一组字符串特色的模式,用来匹配特定的字符串。通过特殊字符+一般字符来进行模式形容,从而达到文本匹配目标工具。因而正则表达式是用于匹配字符串中字符组合的模式。 正则表达式能够很不便的提取咱们想要的信息,所以正则表达式是一个很重要的知识点!欢送大家一起学习~ 全文4082字,预计浏览工夫11分钟。 01 正则概述正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。 02 根本语法2.1 定义形式字面量形式:/^\d+$/g, new RegExp("^\\d+$", "g") 2.2 修饰符 2.3 元字符一个正则表达式模式是由简略的字符所形成的,比方 /abc/;或者是简略和特殊字符的组合,比方 /ab*c/ 2.4 其余断言断言的组成之一是边界。对于文本、词或模式,边界能够用来表明它们的起始或终止局部,分为边界类断言与其余断言。边界类断言有 ^, $, \b, \B,其余断言有 x(?=y), x(?!y), (?<=y)x, (?<!y)x。 注:须要关注写法与真正匹配到的字符串!!! 03 正则对象的属性和办法3.1 属性 △正则属性和办法 var reg=/ab/g;reg.ignoreCase; // false,检测是否含有i 属性reg.global; // true,检测是否含有g 属性reg.multiline; // false,检测是否含有m 属性reg.source; // "ab",匹配内容体var regex =new RegExp("\u{61}","u");regex.unicode // trueconst str1 = "foo bar foo";const regex1 = /foo/dg;regex1.hasIndices // Output: trueregex1.exec(str1).indices[0] // Output: Array [0, 3]regex1.exec(str1).indices[0] // Output: Array [8, 11]const str2 = "foo bar foo";const regex2 = /foo/;regex2.hasIndices // Output: falseregex2.exec(str2).indices // Output: undefined3.2 相干办法这些模式被用于RegExp的exec和test办法,以及String的match、matchAll、replace、search和split办法。 ...

January 12, 2023 · 2 min · jiezi

关于正则表达式:正则表达式学习笔记

从文本中提取数据须要用到正则表达式,以前看过一点,但随着不必很快又遗记了。这次又看了一下,记录一下要点:总体能够分为几类,代表字符的、示意反复的、示意分界的、示意分组的代表字符:.能够代表出换行之外的任意一个字符,留神是一个字符![]中括号内字符能够任意匹配其中一个字符,比方[0-9]示意匹配任意一个数字代表字符的省略用法:\d等价于[0-9],其大写示意相同:\D示意非数字,等价于1\s匹配任意空字符,等价于[ \t\n\r\f]还有一些写法,可参考:https://www.runoob.com/python... 代表反复:*示意反复0-n个其后面的表达式内容+示意反复1-n个其后面的表达式内容?示意反复0-1个其后面的表达式内容{n}示意反复n个其后面的表达式内容,还有{n,}、{n,m} 代表分界^示意开始$示意完结 代表分组(re)括号代表分组,并记住re代表的匹配内容。如果有多个分组,返回时会把内容放在嵌套的元组中返回。 断言示意零宽度断言如下: ?= 正后行断言-存在?! 负后行断言-排除?<= 正后发断言-存在?<! 负后发断言-排除图片参考https://blog.csdn.net/fd2025/... 另外有一个在线的正则表达式测试工具,在剖析文本法则时,能够借助应用,网址是:菜鸟工具https://c.runoob.com/front-en...这篇文章讲的比拟具体,能够参考:https://blog.csdn.net/fd2025/... 0-9 ↩

December 19, 2022 · 1 min · jiezi

关于正则表达式:-regexlearncom游戏化方式学正则语义化css|i18n

regexlearn.com 游戏化形式学正则regexlearn是一个学习正则的开源网站,用户能够通过相似闯关的形式学习正则表达式,亲测包教包会! 先来简略看一看它长什么样子 ⬇️ 目前站内的外围性能是学习正则表达式,它会通过题目和一句话教学疏导你应用正则表达式匹配指定的词句,难度梯度把握的很好。 更重要的是,这个站,尽管很简略,但真的很难看 好喜爱 所以咱们先来看看它为什么给人感觉还不错? UE Design黑绿配色它的背景的彩色不是#000的纯黑,而是灰灰的#282c34,前景色则是不同透明度的rgb(95 245 155),留神,这个绿不是一般的绿,而是王维诗里的绿带点赛博朋克的荧光却不死亡绿。 这两个色彩堪称双双深得程序员本猿的心❤️ 交互动效各种炫酷CSS动效见多了,但它依然是属于难看的那一挂。 认真看看会发现其实也很水,就是一个条纹格的背景图hover后放大移出后放大。能够看看CSS求证求证。 果不其然,class.hover\:bg-\[length\:125\%_125\%\]的hover事件作用就是放大背景尺寸: .hover\:bg-\[length\:125\%_125\%\]:hover { background-size: 125% 125%;}另外,配上一丢丢的动效———?竟然没有css文件,嗯,less也没有,sass也没有,fine。 原来是配上一丢丢的魔法: .hover\:bg-[length\:125\%_125\%].duration-300.transition-all.shadow-sm, .shadow-xl———下面这些class的款式,实则都是由@tailwind解决。 Tailwind CSS 是一个性能类优先的 CSS 框架,它集成了诸如 flex, pt-4, text-center 和 rotate-90 这样的的类,它们能间接在脚本标记语言中组合起来,构建出任何设计。在开发中只须要在src/styles/globals.css下增加以下几行代码,即可应用语义化类名(比方下面那四个class)来发明css。 @tailwind base;@tailwind components;@tailwind utilities;小小的交互挖出大大的宝藏!逃离手写css的常识又+1啦~ 多语言这其实是个很常见的操作了,许多大型网站都是N语言国际化的。但也正是因为它们往往都是大网站,所以想要看清楚它的多语言解决逻辑反而没那么清晰。这个我的项目体量小、语言多,正好适合~ 先来瞅一眼src/pages下的目录构造。 src/pages|____404.tsx|_____document.tsx|_____app.tsx|____[lang]| |____index.tsx| |____learn| | |____index.tsx| | |____[lesson].tsx| |____playground.tsx| |____cheatsheet.tsx作为一个Next.js我的项目,它的目录构造就是路由构造。中文首页https://regexlearn.com/zh-cn就对应着[lang]/index.tsx文件。 回到src下的一级文件。 src|____migration.ts|____context|____types.d.ts|____utils|____styles|____components|____shortcuts.ts|____data|____pages|____localization除了pages,还有localization文件夹,上面是各语言的配置文件。以zh-cn为例,各个语言的文件构造都一样。 src/localization|____zh-cn| |____lessons.json| |____general.json| |____landing.json| |____index.js| |____learn.json| |____cheatsheet.json| |____lessons| | |____regexForSeo.json其中index是个入口文件。具体配置的JSON文件,能够浅看一眼lessons.json,都一样。 { "lessons.regex101.title": "Regex 101 - ZH-CN", "lessons.regex101.description": "您能够在本教程中学习 Regex 的基础知识。 ", "lessons.regexForSeo.title": "Regex for SEO - ZH-CN", "lessons.regexForSeo.description": "在本教程中,您能够理解如何以及在何处应用 Regex 进行 SEO。"}在应用时,只须要下面文件的将key:lessons.regex101.title作为id传入FormattedMessage组件即可 ⬇️ ...

November 25, 2022 · 1 min · jiezi

关于正则表达式:常用正则表达式整理

罕用正则表达式(继续更新)校验数字 1 数字:^[0-9]*$ 或者 ^\d$ 2 n位数字:^\d{n}$ 3 正整数:^(0?|[1-9]\d*)$ 4 最多两位小数:^(0?|[1-9]\d*)(.\d{1,2})?$校验字符 1 汉字:^[\u4e00-\u9fa5]+$ 2 英文和数字:^[A-Za-z0-9]+$其余 1 邮箱:^[\w][email protected][A-Za-z]+(\.[A-Za-z0-9]+){1,2}$ 2 域名:^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}(/)$ 3 ip:^((25[0-5])|(2[0-4]d)|(1dd)|([1-9]d)|d)(.((25[0-5])|(2[0-4]d)|(1dd)|([1-9]d)|d)){3}$ 4 身份证号:^\d{15}|\d{18}$ 5 中国邮政编码:^[1-9]\d{5}(?!\d)$ 6 腾讯QQ号:^[1-9][0-9]{4,}$

September 29, 2022 · 1 min · jiezi

关于正则表达式:正则表达式

简介 Introduction正则表达式(Regular Expression) 是计算机科学的一个概念,正则表达式是应用单个字符串来形容和匹配一系列合乎句法规定的字符串。在很多文本编辑器里,正则表达式通常被用来检索和替换那些合乎某个模式的文本。 匹配规定字面量字符和元字符在正则表达式中,只示意其本身字符含意的叫做字面量字符。其实,大部分字符都示意字面含意。如: /a/ #匹配 'a'/b/ #匹配 'b'/ab/ #匹配 'ab'还有一些字符代表非凡含意,而不是其本身意义,叫做元字符,如: |字符示意“或”运算,匹配|字符右边或左边的字符串,|的数量可推广。/a|b/ #匹配 'a' 或者 'b'/a|b|c/ #匹配 'a' 或 'b' 或 'c'/ab|cd/ #匹配 'ab' 或 'cd' 而不匹配 'a' 或 'b' 或 'c' 或 'd'.字符匹配除了回车、换行、行分隔符和段宰割符的字符。/a.b/ #可匹配a,b之间任意字符,如:'acb','a0b'等,但不匹配两头含有多个字符的状况地位符: ^字符匹配字符串开始的地位$字符匹配字符串完结的地位/^123/ #可匹配'123'呈现在开始地位的字符串,如'12345'/123$/ #可匹配'123'呈现在完结地位的字符串,如'0123'转义字符如果想要匹配正则表达式中的元字符自身,则须要在它们后面加反斜杠\,如: /a\+b/ #匹配 'a+b'正则表达式中须要反斜杠本义的有:|,.,^,$,{,[,(,),\,+,* 特殊字符正则表达式对一些不能打印的字符提供了非凡的示意办法: \cX 示意Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符。[\b] 匹配退格键(U+0008)。\n 匹配换行键。\r 匹配回车键。\t 匹配制表符 tab(U+0009)。\v 匹配垂直制表符(U+000B)。\f 匹配换页符(U+000C)。\0 匹配null字符(U+0000)字符类字符类示意给定一系列字符,只有匹配其中任意一个即可。字符序列被放入方括号[]中,如: /[abc]/ #可匹配'app,因为'app'含有字符'a',但不能匹配'def',因为'def'不含'abc'中任意一个如果方括号内的第一个字符是[^],则示意除了字符类之中的字符,其余字符都能够匹配。比方,[^xyz]示意除了x、y、z之外都能够匹配。/[^abc]/ #能够匹配'cde',但不能匹配'cba'如果方括号内没有其余字符,只有[^],就示意匹配所有字符,其中包含换行符。相比之下,点号作为元字符(.)是不包含换行符的^只有在字符类的第一个地位才有非凡含意,否则就是字面含意。某些状况下,对于间断序列的字符,连字符(-)用来提供简写模式,示意字符的间断范畴。比方,[abc]能够写成[a-c],[0123456789]能够写成[0-9],26个大写字母能够写成[A-Z]。修饰符修饰符放在正则表达式的开端,示意一些附加规定,如: i修饰符示意疏忽大小写/abc/i #可匹配 'abc' 或 'ABC'm修饰符示意会毁坏^和$的匹配规定/name$/ #不能匹配'my name\n'因为结尾不是name,而是换行符/name$/m #能够匹配'my name\n'g修饰符示意全局匹配。默认状况下,正则表达式第一次匹配胜利就进行了,而g修饰符能够匹配到开端/aaaaa/ #只匹配第一个'a'/aaaaa/g #匹配所有的'a'数量符数量符用来示意某个模式的呈现次数。 ? 问号示意某个模式呈现0次或1次。* 星号示意某个模式呈现0次或屡次。+ 加号示意某个模式呈现1次或屡次。/n?ame/ #可匹配'name','ame'/n*ame/ #可匹配'name','ame','nname'/n+ame/ #可匹配'name','nname'数量符默认为贪心匹配,在数量符后加?能够将其变为非贪心匹配: ...

September 15, 2022 · 1 min · jiezi

关于正则表达式:密码校验4选3-生成对应正则

要求类型4选3(匹配时再加上前一种输出判断)外围思路:判断以后输出的前面是不是符合要求 microsoft 的形容 (?!pattern)执行反向预测后行搜寻的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜寻字符串。它是一个非捕捉匹配,即不能捕捉供当前应用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测后行不占用字符,即产生匹配后,下一匹配的搜寻紧随上一匹配之后,而不是在组成预测后行的字符后另一种解释 转自 https://www.oschina.net/question/12_9507 (?<=exp) 也叫零宽度正回顾后 发断言,它断言本身呈现的地位的后面能匹配表达式 exp。比方 (?<=\bre)\w+\b 会匹配以 re 结尾的单词的后半部 分 (除了 re 以外的局部),例如在查找 reading a book 时,它匹配 ading。如果你想要给一个很长的数字中每三位间加一个逗号 (当然是从左边加起了),你能够这样查找须要在后面和外面增加逗号的局部:((?<=\d)\d{3})+\b,用它对 1234567890 进 行查找时后果是 234567890。实操 正向否定 穷举let _arr = ['\\d', 'a-z', 'A-Z', '~!@#$%\\^&\\*\\(\\)\\[\\]\\{\\}\\?\\+'];this.a(_arr, 2, 6, 20);4个参数 明码中蕴含的类型2个类型进行一个组合明码最小长度明码最大长度a(_arr, m = 2, min = 6, max = 20) { let temp = this.bbb(_arr, m); // 拼接字符串 let k = []; for (let val of temp) { k.push(`(?![${val.join('')}]+$)`); } k.push(`[${_arr.join('')}]{${min},${max}}$`); console.log(k); // 生成正则 console.log(new RegExp('^' + k.join(''))); return new RegExp('^' + k.join(''));},k的打印后果 ...

September 8, 2022 · 1 min · jiezi

关于正则表达式:常用正则表达式汇总

汇总了罕用的正则,定期更新。 URL匹配匹配http或https结尾得url,兼容端口号,来自与Yii2框架:validators/UrlValidator.php /^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/iQQ号码5到11位数字,不能以0结尾,其中11位的是手机号码,手机号码也能够当作QQ号码登录 /^[1-9]\d{4,10}$/IP地址来自于Yii2框架:validators/IpValidator.php IPV4 /^(?:(?:2(?:[0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9])\.){3}(?:(?:2([0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9]))$/IPV6 /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/HTML标签匹配单标签、双标签的开始标签和完结标签,可用于革除HTML标签 /<\/?\w+(\s+\w+=(['"]).*\2)*\s*\/?\s*>/暴力模式 /<[^>]*>/中国邮政编码6位数字,能够0结尾。 其中前两位示意省、市、自治区,第三位代表邮区,第四位代表县、市,最初两位代表投递邮局,最初两位是代表从这个城市哪个投递区投递的,即投递区的地位。 /^\d{6}$/严格校验 /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/账号以数字、字母、下划线组合,长度为6-18位 /^\w{6,18}$/以数字、字母、下划线组合,不能应用数字结尾,长度为6-18位 /^[a-zA-Z_]\w{5,17}$/微信号:6至20位,以字母结尾,由字母、数字、减号、下划线组成 /^[a-zA-Z][\w-]{5,19}$/银行卡号蕴含对公账户和对私账号 起源:微信领取 /^[1-9]\d{9,29}$/对立社会信用代码/^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/数字整数,0到1亿 /^(0|[1-9]\d{0,9})$/小数,0到1亿,小数位能够省略 /^(0|[1-9]\d{0,9})(\.\d{1,2})?$/手机号码、座机号码手机号码 /^1[3-9]\d{9}$/座机号码,区号可选,分机号可选,分隔符反对-/ /^(\d{3,4}[-\/]?)?\d{7,8}([-\/]\d{2,4})?$/手机或座机 /^1[3-9]\d{9}$|^(\d{3,4}[-\/]?)?\d{7,8}([-\/]\d{2,4})?$/手机号码严格模式,将每个号段都列举进去https://www.jianshu.com/p/1e8... /^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$/身份证号码18位身份证号码 简略匹配 /^[1-9]\d{16}[\dxX]$/严格匹配,匹配年、月、日格局 /^[1-9]\d{5}[12]\d{3}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dxX]$/香港 /^[a-zA-Z]\d{6}\([\dA]\)$/澳门 /^[1|5|7]\d{6}[(\d)]{3}$/台湾 /^[a-zA-Z][0-9]{9}$/匹配中文JavaScript、Java8、Python /[\u4e00-\u9fa5]/PHP、Golang /[\x{4e00}-\x{9fa5}]/uPHP、Golang,匹配3到5个中文 /^[\x{4e00}-\x{9fa5}]{3,5}$/u匹配区间数字原理就是将数字分段拆分匹配 匹配1-5 /^[1-5]$/匹配1-15,拆分为1-9或10-15 /^(?:[1-9]|1[0-5])$/匹配5-365,拆分为5-9或10-99或100-299或300-359或360-365 /^(?:[5-9]|[1-9]\d|[1-2]\d{2}|3[0-5]\d|36[0-5])$/匹配后缀名匹配以特定的后缀名结尾 /\.(jpg|jpeg|png|gif|webp)$/明码强度明码能够是任意字符,但必须蕴含字母和数字组合,长度为8-32位 /^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{8,32}$/明码能够是任意字符,但必须蕴含大写字母、小写字母和数字组合,长度为8-32位 /^(?=.*[0-9].*)(?=.*[a-z].*)(?=.*[A-Z].*).{5,32}$/火车车次/^[GCDZTSPKXLY1-9]\d{1,4}$/护照蕴含香港、澳门 /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/电子邮箱简略匹配 /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/规范匹配http://www.regular-expression... /^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/单位名称格局:长度在2-30之间,只能蕴含中英文、数字、书名号、&、-、顿号、括号 JavaScript、Java8、Python /^[a-zA-Z0-9《》()()\-、&\u4e00-\u9fa5]{2,30}$/PHP、Golang /^[a-zA-Z0-9《》()()\-、&\x{4e00}-\x{9fa5}]{2,30}$/留神:中文匹配局部须要依据对应语言的写法 单位名称示例: 华为技术有限公司SMC(中国)有限公司TCL华星光电技术有限公司深圳创维-RGB电子有限公司中国兵器工业第二〇五研究所车牌号新能源 /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:((\d{5}[A-HJK])|([A-HJK][A-HJ-NP-Z0-9][0-9]{4}))|[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])$/非新能源 /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$/新能源+非新能源 /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/

August 24, 2022 · 1 min · jiezi

关于正则表达式:正则表达式预查的解释与应用

解释预查又称环视(Lookaround)、属于零宽断言(Zero-Length Assertions)的一种,有 4 个语法: 语法中文名英文名(?=regex)肯定性前瞻Positive lookahead(?!regex)否定性前瞻Negative lookahead(?<=regex)肯定性后顾Positive lookbehind(?<!regex)否定性后顾Negative lookbehind比拟艰深的解释: 肯定性:匹配 regex否定性:不匹配 regex前瞻:向前(右、正向)看(预查)后顾:向后(左、反向)看(预查)肯定性前瞻:先看看后面(左边)是否匹配 regex,但不向前走否定性前瞻:先看看后面(左边)是否不匹配 regex,但不向前走肯定性后顾:回头看前面(右边)是否匹配 regex否定性后顾:回头看前面(右边)是否不匹配 regex利用1、判断是否同时蕴含但不限于大写字母、小写字母和数字,且不能蕴含 114514,长度为 8~32 个字符 /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?!.*114514).{8,32}$/.test('10086@qq.COM')// true2、判断不以 80、82、84、86、88 结尾 /^(?!8[02468])\d+$/.test('81789110')// true3、匹配由空白宰割的字符串中的纯数字串 '123 abc 1st\r\n4 1970\'s 56 @10086 789'.match(/(?<!\S)\d+(?!\S)/g)// ['123', '4', '56', '789']'123 abc 1st\r\n4 1970\'s 56 @10086 789'.match(/(?<=^|\s)\d+(?=\s|$)/g)// ['123', '4', '56', '789']4、仅删除夹在数字中的逗号 'And then, I have 1,003,334, you have 996,6,6,6'.replace(/(?<=\d),(?=\d)/g, '')// 'And then, I have 1003334, you have 996666'5、在数字中增加分组逗号 'And then, I have 1003334, you have 996666'.replace(/(?<=\d)(?=(?:\d{3})+(?!\d))/g, ',')// 'And then, I have 1,003,334, you have 996,666'6、判断是否仅蕴含字母,但不蕴含小写元音字母 ...

July 23, 2022 · 1 min · jiezi

关于正则表达式:正则表达式技巧与注意事项

原创:打码日记(微信公众号ID:codelogs),欢送分享,转载请保留出处。简介现如今,正则表达式简直是程序员的必备技能了,它动手的确很容易,但如果你不认真推敲学习,会长期停留在正则最根本的用法层面上。 因而,本篇文章,我会介绍一些能用正则解决的场景,但这些场景如果全本人推敲实现的话,须要花一些工夫能力实现,或者就齐全想不进去,另外也会介绍一些正则表达式的性能问题。 匹配多个单词比方我想匹配zhangsan、lisi、wangwu这三个人名,这是一个很常见的场景,其实在正则外面也算基本功,但鉴于自己初入门时还是在网上搜寻失去的答案,还是值得提一下的! 实现如下: zhangsan|lisi|wangwu其中|示意或的含意,就是匹配zhangsan或lisi或wangwu了。 匹配反复数字匹配如1111、2222、3333这样的4位长度的反复数字,突一想,这不必\d{4}就解决了嚒,其实不然,因为\d{4}能够匹配1111,但也能够匹配1234啊。 写法如下: (\d)\1{3}\d匹配第一个数字,前面的\1匹配后面\d匹配的内容,反复3次,这样就能够匹配1111或2222这样的4位数字串了。 匹配各种空白在应用正则时,罕用\s来匹配空白,但遗憾的是,还是有一些Unicode的空白字符,\s无奈匹配,这时能够尝试POSIX字符类\p{Space},我在Java中验证通过,能够匹配ascii空白字符与Unicode空白字符,如果是其它语言的话,可能正则语法会稍有区别。 地位匹配正则表达式中\G与环视是比拟难了解的,因为这两个货色很多书上只是介绍了匹配的规定,没有说出本质,导致死记的规定过一段时间就忘,也不明确这两货色有啥用。 咱们转换一下思维,其实在正则表达式中,匹配指标只有两个,一是匹配字符串中的字符,二是匹配字符串中的地位,如下图: 上边的hello,有5个字符能够匹配,另外还有6个地位能够匹配,而^hello中^就是代表匹配结尾的地位,所以如果是_hello就无奈被^hello匹配,因为_与h之间的地位并不是结尾,不能与^匹配! 常见地位匹配规定 规定匹配的地位^ \A匹配开始地位$ \z \Z匹配完结地位\b \B匹配单词与非单词边界地位\G匹配以后匹配的开始地位(?=a) (?!a)正向环视,看看以后地位前面是否是a,或不是a(?<=a) (?<!a)逆向环视,看看以后地位后面是否是a,或不是a^与\A ^ 匹配文本开始地位,但在多行匹配模式下,^匹配每一行的开始地位。 \A 仅仅只能匹配开始地位,不论什么匹配模式下 $与\Z $ 匹配文本开端地位,但在多行匹配模式下,$匹配每一行的开端地位。 \Z 仅仅只能匹配开端地位,不论什么匹配模式下 \b与\B \b匹配单词边界,在Java中,单词边界即是字母与非字母之间的地位,中文不认为是单词,另外文本结尾与文本结尾也是单词边界 \B匹配非单词边界 \G 匹配上次匹配的完结地位或以后匹配的开始地位,第一次匹配时,匹配文本开始地位,如下: 从1234a5678中找单个数字,如果用\d去找,能够找到8个,但应用\G\d去找,却只能找到4个 查找过程: 第1次查找,\G匹配文本开始地位,1与\d匹配,找到第1个匹配,即1 第2次查找,\G匹配1前面2后面之间的地位,2与\d匹配,找到第2个匹配,即2 第3次查找,\G匹配2前面3后面之间的地位,3与\d匹配,找到第3个匹配,即3 第4次查找,\G匹配3前面4后面之间的地位,4与\d匹配,找到第4个匹配,即4 第5次查问,\G匹配4前面5后面之间的地位,但a与\d不匹配,匹配完结,总共找到4个匹配。 环视 (?=a) 与 (?!a) 正向必定(否定)环视,用来检测以后地位前面字符是否是a,或不是a (?<=a) 与 (?<!a) 逆向必定(否定)环视,用来查看以后地位后面字符是否是a,或不是a 如下,查找被()包裹的单词,应用环视限定单词右边是(,左边是) 地位可被屡次匹配 文本中的一个地位,能够同时匹配多个规定,且与规定在正则表达式中的先后顺序无关,例如上面3个正则表达式是等价的: ^abc^^^^^^abc^(?=a)\b^^^abc 上面举两个理论例子领会一下地位匹配! 例1:明码强度校验 前端校验明码强度时,常常有这样的要求,长度8到10位,且必须蕴含数字、字母、标点符号,可通过一个正则表达式校验进去,如下: ^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\p{P}).{8,10}$其中,(?=.*[0-9])示意结尾地位的前面肯定要有数字,(?=.*[a-zA-Z])示意结尾地位前面肯定要有字母,(?=.*\p{P})示意结尾地位的前面肯定要有标点符号,.{8,10}示意匹配8到10位字符,这几个正则合在一起,就实现了校验明码强度的要求。 例2:千分位数字 有时咱们须要将123456789变成123,456,789这样的千分位数字,这个应用正则就能够实现,如下,将此正则匹配到的地位,替换为,: (?!^)(?=(\d{3})+$)其中,(?=(\d{3})+$)示意匹配地位,这个地位前面必须要有一组或多组3个数字,满足这样条件的地位有3个,结尾与1之间的地位,3和4之间的地位,6和7之间的地位,而后(?!^)又限度了同样的这些地位,不能是结尾,就只能3和4,6和7之间的地位满足要求了,所以替换之后,就变成了123,456,789。 ...

April 5, 2022 · 1 min · jiezi

关于正则表达式:在线正则表达式大全测试

在线正则表达式大全测试在线正则表达式大全测试 本工具提供在线正则表达式的测试,反对替换,客户端实时计算,数据实时更新。本工具提供在线正则表达式的测试,反对替换,客户端实时计算,数据实时更新。本工具提供在线正则表达式的测试,反对替换,客户端实时计算,数据实时更新。 https://tooltt.com/regexp/

March 29, 2022 · 1 min · jiezi

关于正则表达式:初识正则表达式

什么是正则表达式正则表达式,英文名Regular Expression,常见缩写regex、regexp或RE都指代正则表达式。 正则表达式是对句法规定的一种形容。正则表达式应用单个字符串来形容、匹配一系列匹配某个句法规定的字符串。 正则表达式是由一些根本的汇合及对汇合的运算组成的。 根本元素一般字符 字母、数字、汉字、下划线、以及后边章节中没有非凡定义的标点符号,都是"一般字符"。表达式中的一般字符,在匹配一个字符串的时候,匹配与之雷同的一个字符。 举例: 表达式 "c",在匹配字符串 "abcde" 时,匹配后果是:胜利;匹配到的内容是:"c",匹配到的地位是:开始于2,完结于3。(注:下标从0开始还是从1开始,因以后编程语言的不同而可能不同)根本运算交加如果有两个正则表达式E和F,那么EF也是一个正则,示意同时匹配E和F的内容。这跟编程中的逻辑与是一个意思,跟汇合中的交加也是一个意思。你也能够连贯任意多个正则。 举例: 表达式 "bc",在匹配字符串 "abcde" 时,匹配后果是:胜利;匹配到的内容是:"bc",匹配到的地位是:开始于1,完结于3。并集如果有两个正则表达式E和F,那么E|F也是一个正则,示意匹配E或者匹配F。这跟编程中的逻辑或是一个意思,跟汇合中的并集也是一个意思。 你能够应用|连贯任意多个正则表达式。 如果你要连贯十分多的正则,那就得写十分多的竖线,看起来十分乱。所以人们还约定了一种简化记法[EFGH],跟写成E|F|G|H成果是一样,但前者更简短,更清晰。 举例: 表达式 " [bcd][bcd] " 匹配 "abc123" 时,匹配的后果是:胜利;匹配到的内容是:"bc";匹配到的地位是:开始于1,完结于3。补集如果你要排除匹配E和F的内容,须要写成 [ ^EF ] 举例: 表达式 "[^abc]" 匹配 "abc123" 时,匹配的后果是:胜利;匹配到的内容是:"1";匹配到的地位是:开始于3,完结于4。单元素汇合连字符示意多个元素一个字母a, 一个数字1都是正则,别离匹配蕴含a和蕴含1的内容。 如果咱们想匹配数字1234,那么依据交加规定,咱们写成1234就能够了。 如果咱们想匹配所有可能呈现的数字,则能够依据并集规定写成0|1|2|3|4|5|6|7|8|9。是不有点长。咱们能够简化成[0123456789]。一下子少了很多坚线。 慢着,如果想匹配所有可能呈现的小写字母呢?难不成要将26个字母全副写入正则表达式中? 正则表达式为此提供了一种更加简化办法——连字符,能够应用减号-示意间断呈现的字符,只需写出头尾。所以咱们能够把[0123456789]进一步简化成[0-9],把[abc...xyz]简化成[a-z]。 \d因为[0-9]很罕用,大家又进一步简化成了\d(对应单词 digit)。 \a因为[a-zA-Z]也很罕用,大家就把它简化成\a(对应单词 alpha)。 \w果想匹配大小写字母、数字和下划线(也就是所有单词字符),能够写成[a-zA-Z0-9_]。也是因为太罕用,大家将其简化为\w(对应单词 word)。 \s如果想匹配一些空白字符,能够写成[ \t\r\n\v\f],这个正则会匹配空格、程度制表符、回车、换行、 垂直制表符和 Page break 记。这里用到了跟 c 语言 printf 函数一样的转义字符。同样因为应用宽泛,被简化为\s(对应单词 space)。 取反——大写正则反对取反操作。[0-9]示意匹配所有数字,那[ ^0-9 ]就示意匹配所有非数字字符。因为应用宽泛,人们将其简写成\D。大家留神,[0-9]简写成\d(小写字母),对应的[ ^0-9 ]简写成\D(大写字母)。以此类推,\a取反是\A、\w取反是\W、\s取反是\S。 选集有了连字符和并集规定,实践上咱们能够匹配所有字符。然而 Unicode 有上百万字符,难道咱们都要写到方括号里吗?不可能。 咱们能够利用取反操作。只有排除大量不罕用字符,就能够匹配剩下的大多数字符了。但排除哪个呢?最终人们决定排除\n。为什么呢?因为一般而言,正则都是逐行匹配的,一次匹配一行内容,不会遇到换行符。最终能够用[ ^\n ]示意匹配所有字符。同样因为太罕用,这一写法被简化成句点'.'。 也就是说在正则表达式中,一个.能够匹配\n以外的所有字符。 转义字符\ ...

March 20, 2022 · 1 min · jiezi

关于正则表达式:正则表达式正向匹配与反向匹配

正向表达式就是所匹配要操作的字符串在前,表达式pattern在后;反向表达式则是表达式pattern在前,所匹配要操作的字符串在后。exc(?:pattern) 匹配pattern但不获取匹配后果,也就是说这是一个非获取匹配,不进行存储供当前应用。这在应用或字符“(|)”来组合一个模式的各个局部是很有用。例如“factor(?:y|ies)”就是一个比“factory|factories”更简略的表达式 var ary = 'factorywork' const reg = /factor(?:y|ies)/ const str = ary.replace(reg, '') console.log('str:', str) // str: work // 和(?=pattern)的区别前者是组合各个局部 // str: yworkexc(?=pattern) (查找合乎pattern规定的exc局部)正向必定预查,在任何匹配pattern的exc开始处匹配查找字符串。这是一个非获取匹配,该匹配不须要获取供当前应用。 var ary = 'factory123work123factory866' const reg = /factory(?=\d)/g const str = ary.replace(reg, '') console.log('str:', str) // str: 123work123866exc(?!pattern) 正向否定预查,在任何不匹配pattern的exc开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不须要获取供当前应用。 var ary = 'factorywork123factory866' const reg = /factory(?!\d)/g const str = ary.replace(reg, '') console.log('str:', str) // str: work123factory866(?<=pattern)exc 反向必定预查,与正向必定预查相似,只是方向相同。查找合乎表达式pattern的exc。 var ary = 'factorywork123factory866' const reg = /(?<=\d)factory/g const str = ary.replace(reg, '') // 去掉数字前面factory局部 console.log('str:', str) // str: factorywork123866(?<!pattern)exc 反向否定预查,与正向否定预查相似,只是方向相同。 var ary = 'thisfactorywork123factory866' const reg = /(?<!\d)factory/g const str = ary.replace(reg, '') // 去掉非数字后的factory console.log('str:', str) // str: thiswork123factory866

March 2, 2022 · 1 min · jiezi

关于正则表达式:在线正则表达式可视化测试工具

在线正则表达式可视化测试工具在线正则表达式可视化测试工具 在线正则表达式可视化测试工具。在线正则表达式可视化测试工具。 https://tooltt.com/regulex/

January 14, 2022 · 1 min · jiezi

关于正则表达式:正则表达式应用之身份证号识别

明天我的项目中遇到了身份证号辨认的问题,须要辨认15或18位的居民身份证,网上查了一下,感觉很有意思,这里跟大家分享下我的了解过程,心愿能帮忙大家更好的学习正则表达式。18位身份证号辨认/^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/这是一个比较完善的辨认正则,间接看的话一头雾水,咱们先来把他别离成5个局部,首先要阐明的是:结尾的^符号示意待辨认对象的结尾,也就是一个字符串开始的地位,而$示意字符串完结的地位。 part1(身份证1-6位):^([1-6][1-9]|50)\d{4}方括号中的1-6示意1-6中的任意数字,1-9示意1-9之间的任意数字,所以[1-6][1-9]组合起来示意的是合乎规定的两个数字,紧接着的|示意或的关系,也就是说可能为50,再接着的\d{4}示意四位数字。因而part1规定了18位居民身份证号的前6位。 part2(身份证7-10位):(18|19|20)\d{2}这部分比拟容易了解,首先是(18|19|20),示意可能是18、19、20,接着前面的\d{2}示意为两位数字。 part3(身份证11-12位):((0[1-9])|10|11|12)与part2相似,外部括号的内容:(0[1-9])示意两位数字,其中第一位为0,第二位为0-9中任意数字。竖杠示意或者的关系,示意也有可能是10、11、12,总之这段正则就是对两位数字进行限度。 part4(身份证13-14位):(([0-2][1-9])|10|20|30|31)与part3相似,首先限度了一个两位数([0-2][1-9]),第一个数为0-2,第二个数为1-9,前面的为除了这个规定之外可能的两位数(可能是10、20、30、31) part5(身份证15-18位):\d{3}[0-9Xx]$这部分也很好了解,首先是3位数字,而后对最初一位(18位)进行限定,这一位可能是0-9间接的数字,也可能是X或者是小写x,最初的最初用$示意整个字符串的结尾。 15位身份证号辨认/^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/15位身份证的正则辨认和18位的相似,咱们也是拆开一块一块的来看。 part1(身份证1-6位):^([1-6][1-9]|50)\d{4}这部分与15位的part1统一,不做赘述。 part2(身份证7-10位):\d{2}((0[1-9])|10|11|12)首先\d{2}示意两位数字,而后括号外面也是示意对两位数字的规定校验(这里校验的是月份)。 part3(身份证11-12位):(([0-2][1-9])|10|20|30|31)这部分也是示意两位数字,不做赘述。 part4(身份证13-15位):\d{3}$三位数字及完结符号。 一个小小的举荐作为正则表达式的初学者,刚开始肯定会感觉拆分正则比拟艰难,因为有的正则可能写的很长很长,这里给大家举荐一个可能格式化正则的网站,把正则粘上去,网站就会主动的给拆成一块一块的。RegExr总结不论是前端工程师还是后端工程师,正则表达式都是须要把握的一门技术,深有感触的是在刷一些leetcode的时候,正则总是能出人意料的字符串问题笨重化解,在工作中,正则也大有用途,不得不说,正则真的是太微妙了!

December 20, 2021 · 1 min · jiezi

关于正则表达式:5-分钟快速掌握-shell-中的正则表达式

本文首发于众里千寻 - 5 分钟疾速把握 shell 中的正则表达式我常常会在命令行应用 grep 等命令解决一些文本查找的问题。在应用正则表达式的时候常常会碰到一些令人困惑的问题,比方同样的正则表达式在一个命令中能够用,在另一个命令中却不能够用。 明天咱们来好好整顿下 shell 中的正则表达式,这样在应用的时候可能驾轻就熟。 分类正则表达式最早在 1950 年代由美国数学家 Stephen Cole Kleene 提出,起初被 Unix 操作系统的文本处理工具宽泛应用。 通过多年的倒退和实际,最终造成两大规范,一个是 POSIX 规范,另一个是 Perl 规范。后者本是为 Perl 语言实现的,因为其性能十分弱小,被 Java、JavaScript 等语言宽泛借鉴,从而被宽泛应用。 咱们这里将正则表达式分为三类: 根本正则表达式(Basic Regular Expression 简称 BRE),由 POSIX 规范定义。扩大正则表达式(Extended Regular Expression 简称 ERE),也由 POSIX 规范定义。Perl 的正则表达式(Perl Regular Expression 简称 PRE),由 Perl 语言定义。组成部分根本组成部分下表展现了正则表达式的根本组成部分。 正则表达式形容示例Basic RegExExtended RegExPerl regEx\本义符,将特殊字符进行本义,疏忽其非凡意义a.b匹配a.b,但不能匹配ajb,.被本义为非凡意义\\\^匹配行首^tux匹配以tux结尾的行^^^$匹配行尾tux$匹配以tux结尾的行$$$.匹配除换行符\n之外的任意单个字符ab.匹配abc或bad,不可匹配abcd或abde,只能匹配单字符...[]匹配蕴含在[字符]之中的任意一个字符coo[kl]能够匹配cook或cool[][][][^]匹配1之外的任意一个字符1232不能够匹配1234或1235,1236、1237都能够[^][^][^][-]匹配[]中指定范畴内的任意一个字符,要写成递增[0-9]能够匹配1、2或3等其中任意一个数字[-][-][-]?匹配之前的项1次或者0次colou?r能够匹配color或者colour,不能匹配colouur不反对??+匹配之前的项1次或者屡次sa-6+匹配sa-6、sa-666,不能匹配sa-不反对++*匹配之前的项0次或者屡次co*l匹配cl、col、cool、coool等***()匹配表达式,创立一个用于匹配的子串ma(tri)?匹配max或maxtrix不反对()(){n}匹配之前的项n次,n是能够为0的正整数[0-9]{3}匹配任意一个三位数,能够扩大为0-9[0-9]不反对{n}{n}{n,}之前的项至多须要匹配n次[0-9]{2,}匹配任意一个两位数或更多位数不反对{n,}{n,}{n,m}指定之前的项至多匹配n次,最多匹配m次,n<=m[0-9]{2,5}匹配从两位数到五位数之间的任意一个数字不反对{n,m}{n,m}|交替匹配|两边的任意一项ab(c|d)匹配abc或abd不反对||POSIX 字符类POSIX字符类是一个形如[:...:]的非凡元序列(meta sequence),他能够用于匹配特定的字符范畴。 正则表达式形容示例Basic RegExExtended RegExPerl RegEx[:alnum:]匹配任意一个字母或数字字符[[:alnum:]]+[:alnum:][:alnum:][:alnum:][:alpha:]匹配任意一个字母字符(包含大小写字母)[[:alpha:]]{4}[:alpha:][:alpha:][:alpha:][:blank:]空格与制表符(横向和纵向)[[:blank:]]*[:blank:][:blank:][:blank:][:digit:]匹配任意一个数字字符[[:digit:]]?[:digit:][:digit:][:digit:][:lower:]匹配小写字母[[:lower:]]{5,}[:lower:][:lower:][:lower:][:upper:]匹配大写字母([[:upper:]]+)?[:upper:][:upper:][:upper:][:punct:]匹配标点符号[[:punct:]][:punct:][:punct:][:punct:][:space:]匹配一个包含换行符、回车等在内的所有空白符[[:space:]]+[:space:][:space:][:space:][:graph:]匹配任何一个能够看得见的且能够打印的字符[[:graph:]][:graph:][:graph:][:graph:][:xdigit:]任何一个十六进制数(即:0-9,a-f,A-F)[[:xdigit:]]+[:xdigit:][:xdigit:][:xdigit:][:cntrl:]任何一个控制字符(ASCII字符集中的前32个字符)[[:cntrl:]][:cntrl:][:cntrl:][:cntrl:][:print:]任何一个能够打印的字符[[:print:]][:print:][:print:][:print:]元字符元字符(meta character)是一种 Perl 格调的正则表达式,只有一部分文本处理工具反对它,并不是所有的文本处理工具都反对。 正则表达式形容示例Basic RegExExtended RegExPerl RegEx\b单词边界\bcool\b 匹配cool,不匹配coolant\b\b\b\B非单词边界cool\B 匹配coolant,不匹配cool\B\B\B\d单个数字字符b\db 匹配b2b,不匹配bcb不反对不反对\d\D单个非数字字符b\Db 匹配bcb,不匹配b2b不反对不反对\D\w单个单词字符(字母、数字与_)\w 匹配1或a,不匹配&\w\w\w\W单个非单词字符\W 匹配&,不匹配1或a\W\W\W\n换行符\n 匹配一个新行不反对不反对\n\s单个空白字符x\sx 匹配x x,不匹配xx不反对不反对\s\S单个非空白字符x\S\x 匹配xkx,不匹配xx不反对不反对\S\r回车\r 匹配回车不反对不反对\r\t横向制表符\t 匹配一个横向制表符不反对不反对\t\v垂直制表符\v 匹配一个垂直制表符不反对不反对\v\f换页符\f 匹配一个换页符不反对不反对\f常见命令中的应用命令Basic RegExExtended RegExPerl RegExgrep反对需加 -E 参数需加 -P 参数egrep反对反对需加 -P 参数sed反对需加 -r 参数不反对awk反对反对不反对常见面试知识点、技术解决方案、教程,都能够扫码关注公众号“众里千寻”获取,或者来这里 https://everfind.github.io 。 ...

December 10, 2021 · 1 min · jiezi

关于正则表达式:正则表达式完整教程略长

引言敬爱的读者敌人,如果你点开了这篇文章,阐明你对正则很感兴趣。 想必你也理解正则的重要性,在我看来正则表达式是掂量程序员程度的一个侧面规范。 对于正则表达式的教程,网上也有很多,置信你也看了一些。 与之不同的是,本文的目标是心愿所有认真读完的童鞋们,都有实质性的进步。 本文内容共有七章,用JavaScript语言残缺地探讨了正则表达式的方方面面。 如果感觉文章某块儿没有说明确分明,欢送留言,能力范畴之内,老姚必做具体解答。 具体章节如下: 引言第一章 正则表达式字符匹配攻略第二章 正则表达式地位匹配攻略第三章 正则表达式括号的作用第四章 正则表达式回溯法原理第五章 正则表达式的拆分第六章 正则表达式的构建第七章 正则表达式编程后记上面简略地说说每一章都探讨了什么? 正则是匹配模式,要么匹配字符,要么匹配地位。 第1章和第2章以这个角度去解说了正则的根底。 在正则中能够应用括号捕捉数据,要么在API中进行分组援用,要么在正则里进行反向援用。 这是第3章的主题,解说了正则中括号的作用。 学习正则表达式,是须要理解其匹配原理的。 第4章,解说了正则了正则表达式的回溯法原理。另外在第6章里,也解说了正则的表达式的整体工作原理。 不仅能看懂他人的正则,还要本人会写正则。 第5章,是从读的角度,去拆分一个正则表达式,而第6章是从写的角度,去构建一个正则表达式。 学习正则,是为了在真实世界里利用的。 第7章解说了正则的用法,和相干API须要留神的中央。 如何浏览本文? 我的倡议是浏览两遍。第一遍,不求甚解地疾速浏览一遍。浏览过程中遇到的问题无妨记录下来,兴许浏览结束后就能解决很多。而后有工夫的话,再带着问题去精读第二遍。 深呼吸,开始咱们的正则表达式旅程吧。我在起点等你。 第一章 正则表达式字符匹配攻略正则表达式是匹配模式,要么匹配字符,要么匹配地位。请记住这句话。 然而对于正则如何匹配字符的学习,大部分人都感觉这块比拟芜杂。 毕竟元字符太多了,看起来没有系统性,不好记。本章就解决这个问题。 内容包含: 两种含糊匹配字符组量词分支构造案例剖析1 两种含糊匹配如果正则只有准确匹配是没多大意义的,比方/hello/,也只能匹配字符串中的"hello"这个子串。 var regex = /hello/;console.log( regex.test("hello") ); // => true正则表达式之所以弱小,是因为其能实现含糊匹配。 而含糊匹配,有两个方向上的“含糊”:横向含糊和纵向含糊。 1.1 横向含糊匹配 横向含糊指的是,一个正则可匹配的字符串的长度不是固定的,能够是多种状况的。 其实现的形式是应用量词。譬如{m,n},示意间断呈现起码m次,最多n次。 比方/ab{2,5}c/示意匹配这样一个字符串:第一个字符是“a”,接下来是2到5个字符“b”,最初是字符“c”。测试如下: var regex = /ab{2,5}c/g;var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";console.log( string.match(regex) ); // => ["abbc", "abbbc", "abbbbc", "abbbbbc"]留神:案例中用的正则是/ab{2,5}c/g,前面多了g,它是正则的一个修饰符。示意全局匹配,即在指标字符串中按程序找到满足匹配模式的所有子串,强调的是“所有”,而不只是“第一个”。g是单词global的首字母。 ...

November 19, 2021 · 15 min · jiezi

关于正则表达式:正则表达式实例搜集通过实例来学习正则表达式

正则表达式实例收集,通过实例来学习正则表达式。本仓库实例搜集整理来自于《一些正则表达式随记》,通过一个独自仓库专门整顿这些正则实例,提供一个实例网站,不便正则实例验证和查问。也不便增加新的正则实例大家独特保护。 国内镜像站点 · Gitee · Github 如果有一些基础知识,通过实例了解,将会更疾速入门,写出本人的正则。如果对根底还不是很理解,你能够通过《Learn regex the easy way》去学习基础知识,这个仓库教程被翻译成十几种语言了,蕴含了中文翻译,它通过极其简略的实例,帮忙你了解正则根底语法规定。 Example身份证号^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$ E.g: 42112319870115371X 用户名^[a-zA-Z0-9_-]{4,16}$ E.g: jaywcjlove。验证 数字、字母、_、-,不蕴含特殊字符,长度 4-16 之间。 微信号^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$ E.g: jslite。微信号正则,6至20位,以字母结尾,字母,数字,减号,下划线。 明码强度(宽松)^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ E.g: diaoD123, Wgood123。必须是蕴含大小写字母和数字的组合,长度在 8-10 之间。 ^[0-9a-zA-Z\u4E00-\uFA29]*$ E.g: diaoD123, Wgood123。数字字母中文。 明码强度(蕴含特殊字符)^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$ E.g: diaoD123#, Wgood123#$。明码强度正则,起码6位,包含至多1个大写字母,1个小写字母,1个数字,1个特殊字符。 火车车次^[GCDZTSPKXLY1-9]\d{1,4}$E.g: G2868, D22, D9, Z5, Z24, Z17 汉字中文^[\u4e00-\u9fa5]{0,}$ E.g: 中文, 湖北, 黄冈。不限度文字长度。 ^[\u4e00-\u9fa5]{2,6}$ E.g: 中文, 湖北黄冈。2到6位汉字 中文名字^(?:[\u4e00-\u9fa5·]{2,16})$ E.g: 周杰伦, 古丽娜扎尔·拜合提亚尔, 拉希德·本·穆罕默德·本·拉希德。 英文姓名(^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$) E.g: Gene Kelly, Fred Astaire, Humphrey Bogart, GaryCooper, Cary Grant, Joan Crawford ...

November 18, 2021 · 2 min · jiezi

关于正则表达式:十月热点EasyDL八大国产芯片实现模型部署全适配度目智能门禁机CMA1重磅发布

10月,EasyDL模型部署国产芯片适配类型丰盛度再进一步,新增「飞腾CPU」、「龙芯CPU」、「寒武纪MLU270」、「比特大陆SC5+」4款国产芯片部署能力,实现八大支流国产芯片全适配。度目智能门禁机 CM-A1全新公布,搭载Android零碎,提供二次开发接口,可自定义软件性能;丰盛接口预留、POE继续护航。 本月共有14项重要产品能力降级、上新,上面就给你带来百度大脑最新动静。 重点领先看 国内当先!EasyDL国产芯片适配类型丰盛度再进一步 EasyDL新增4款国产芯片部署能力,反对「飞腾CPU」、「龙芯CPU」、「寒武纪MLU270」、「比特大陆SC5+」 ,实现八大支流国产芯片全适配,进一步满足用户多场景适配需要。 八大支流国产芯片全适配:EasyDL提供最宽泛的模型部署适配能力,目前已宽泛适配反对超过20+芯片类型,其中国产芯片更是实现八大国产支流芯片(华为昇腾、华为海思、瑞芯微NPU、寒武纪MLU270、飞腾CPU、龙芯CPU、昆仑XPU、比特大陆SC计算卡)全笼罩。强强联手,疾速实现降本增效:国产芯片高性价比劣势+EasyDL零门槛开发,在框架与网络适配方面,累计反对上万种框架网络芯片组合,充沛满足了开发者的部署场景细分需要适应更多细分场景,助力企业疾速实现降本增效。立刻体验 > https://ai.baidu.com/easydl/?... 度目智能门禁机 CM-A1全新公布 ,共性开发随心定制 度目智能门禁机 CM-A1, 百度自主研发,利用于人员通行、考勤场景,反对人脸、刷卡、二维码等多种核验形式的智能门禁机。 >>产品亮点 精工打造,松软耐造: 8寸高清屏,全金属机身,反对 IP65+ 防水防尘等级,无惧残酷环境,室内室外装置无忧算法当先,精准辨认: 反对6~90岁全年龄段,动静学习,优化老人、儿童辨认成果,轻松应答暗光、强光、逆光等各种简单光线环境共性开发,随心定制: 搭载Android零碎,提供二次开发接口,可自定义软件性能丰盛接口预留 , POE继续护航: 反对GPIO多路扩大,韦根输入输出,USB2.0/Host type-c 物理接口,POE供电硬件搭配 , 核验全面: 搭载RGB/IR 双目高清摄像头、屏下刷卡模块、专用二维码摄像头,提供人脸/刷卡/二维码辨认组合核验部署灵便,装置便捷: 闸机式、立柱式、壁挂式装置>>产品外围性能 身份核验:人脸、刷卡、二维码、身份证多种组合核验形式,可扩大身份证读卡器真人检测: 双目多模态活体检测,可分别来自打印纸,照片,手机屏、电脑屏、面具、头模的舞弊行为音频对讲 : 反对喇叭、提醒语、呼吸灯等多通道反馈辨认后果,可反对音视频对讲权限治理: 人员限时通行、访客限时通行、黑名单人员通行管控运维治理: 反对本地降级、云端静默降级,设施状态运维> >典型利用场景 智慧社区:出入口治理、单元楼刷脸开门智慧校园:学生签到、访客治理、校舍治理智慧园区:访客治理、无卡通行、门禁治理高端酒店:酒店员工考勤、入住核验查看详情 > https://ai.baidu.com/dumu/cma 医疗测验报告单辨认 【 全新公布】 可辨认全国各地医疗测验报告单,返回:姓名、医院名称、报告单名称,以及查看具体我的项目的项目名称、后果、单位、参考区间等信息。模型针对文本歪斜、蜿蜒等状况专项优化,辨认准确率高;可利用于在线问诊场景,辅助医生疾速解读报告单。 查看详情 > https://ai.baidu.com/tech/ocr... 户口本辨认【 能力降级 】 新增反对户口本首页(户主页)辨认,包含户别、户主姓名、户号、住址、户主页工夫 5 个关键字段,单次调用低至0.0096元/次。 立刻体验 > https://ai.baidu.com/tech/ocr... 身份证辨认【 能力降级 】 新增身份证裁剪性能,可返回身份证全图裁剪的base64编码及地位信息,主动去除多余背景、改正拍摄角度,晋升业务应用便捷性;加【料】不加价,双十一大促狂欢,新客首购1元/W次,次数包限时6折。 查看详情 > https://ai.baidu.com/ai-doc/O... 银行卡辨认【 能力降级 】 新增反对“持卡人”字段辨认,可辨认信用卡侧面持卡人英文姓名 ,并专项优化凹凸字体辨认,进一步晋升银行卡号辨认准确率。 立刻体验 > https://ai.baidu.com/tech/ocr... 行驶证辨认、驾驶证辨认 【能力降级】 新增证件品质检测性能,对证件边框不残缺、遮挡状况进行告警提醒,不便过滤低质量的图像,晋升综合辨认成果。 查看详情 > https://ai.baidu.com/ai-doc/O... 内容审核平台 降级,反对审核后果可视化治理【性能降级】 业务人员可实时查看审核后果明细和违规起因散布,不便疾速调整细粒度审核标签,优化审核策略,实现内容危险即审、即见、即改。 审核后果数据统计:图形化展现各项审核服务的调用状况,包含分时段调用量、违规起因散布等,帮忙业务人员实时把握内容危险趋势,以便及时调整业务策略和应答措施审核后果可视化查问:可一键查看30天内的图像、文本审核记录明细数据,并反对导出本地文件,晋升人工抽验或复核的效率 申请试用> https://ai.baidu.com/support/...  图像审核-政治敏感辨认【 能力降级 】 政治/公众人物新增数十名暴恐、邪教敏感人物,及最新曝光的劣迹艺人。全面的公众人物库,紧跟监管政策要求,继续晋升审核全面性。 立刻体验 > https://ai.baidu.com/tech/ima... ...

November 15, 2021 · 1 min · jiezi

关于正则表达式:垃圾分类与AI的反碎片之旅

近年来,我国减速推广垃圾分类制度,2021年5月,国家发改委和住建部联结公布《“十四五”城镇生存垃圾分类和解决设施倒退布局》,要求到2025年底,京津冀及周边、长三角、粤港澳大湾区、长江经济带、黄河流域、生态文化试验区具备条件的县城根本建成生存垃圾分类和解决零碎;激励其余地区踊跃晋升垃圾分类和解决设施笼罩程度。 自此,垃圾分类成为国策。 你兴许会认为,这是一个脏活、累活、苦活,这样的构想也不为过。然而,你可能不晓得,这其中也蕴藏着微小的经济价值。 我国是人口大国,也是垃圾产生大国,2021年我国生存垃圾产量27097.2万吨。 因为统计口径的不同,对于垃圾分类市场的市场价值评估差异较大,但即便按较激进的计算,这也是一个千亿级市场;如果依照咱们的考察,仅仅一个宁波市,每年回收废弃物的价值就高达560亿人民币。 如果有一种办法,既能够解决垃圾分类中的苦、脏、累,又能晋升分拣效率、晋升行业效率,让“变废为宝”成为一件绝对轻松的工作,是否是一个社会期待的称心抉择? 为了这个指标,AI来了。 1聚焦宁波 6月24日,世界银行执行董事会批准给中国提供贷款4.3亿美元,其中的1.5亿美元贷款将用于宁波的垃圾分类。 宁波作为东部沿海城市,曾经开始采取了先进的垃圾治理、循环利用和预防措施,在国内属于当先地位。 因而,此次的世行资金,次要用于宁波全品类智能回收箱的落地,该我的项目联合智慧化治理、区块链记账等技术劣势对前段垃圾分类用户进行疏导、对垃圾回收流程进行大数据分析和智慧化治理,实现对生存垃圾分类端+回收端的清运回收可控治理、老本优化、数据分析,这也标记着宁波行将步入垃圾分类“数智”治理时代。 机会只留给有筹备的人,宁波蔚澜就是这样一家企业。此前,它是一家生产物联网配电柜的企业,公司负责人范世杰十分关注市场动态,在2018年底,当他看到央视开始宣传垃圾分类时,立即产生了一个念头——垃圾分类柜这种货色,实质上和物联网配电柜的差异不大。 范世杰立即开始市场考查,认为过后市场上生产的垃圾分类柜,以蔚澜的技术齐全能够做,于是立即在2018年11月投入研发,2019年3月拿出了样机。 然而在实践中,他也发现,垃圾分类柜其实波及到一个简单的经济闭环。例如,废玻璃的回收后,每吨只能卖70-80元,而废纸板每吨却高达2000元以上,但废纸板须要具体分类,因为不同类型的回收价格也不同,所以如果设施可能在前端对垃圾进行更精准的分类,经济效益和整个回收闭环都有很大的优化空间。 所有的垃圾中,最难解决的是厨余垃圾。个别人可能很难设想,散发着异味、容易糜烂的厨余垃圾其实有很高的经济价值,但厨余垃圾的解决也是最艰难的。很常见的一个问题就是,居民在分类时不够精密,把其它垃圾混淆在厨余垃圾里,这就波及到两个动作——须要对垃圾进一步分拣,还须要揭示居民留神相似问题。 所以真正的挑战,是减少厨余垃圾分拣这个环节,因为辨认难度大增。严格的说,没有主动破袋+厨余垃圾辨认的前两代产品,只能叫“主动分类柜”,只有这两个性能齐备了,能力叫“智能分类柜”。 让范世杰感到侥幸的是,公司新招来了AI技术总监杜一品。大家都晓得AI的人才奇缺,有残缺的AI开发教训的人更少。 杜一品来到蔚澜之前,也深知这家公司并没有残缺的AI团队,然而,他有底气,因为把握了新的工具——百度飞桨企业版EasyDL。 EasyDL(以及各类的AutoML/DL)的独特理念,就是“用AI技术来帮忙人们设计AI”,换句话说,开发一AI模型的流程中,波及的数据处理、特征提取、模型抉择、参数调节、训练部署等环节,都利用AI能力才实现了高度的自动化,通过简略的学习即可使用。 杜一品用EasyDL轻松实现了厨余垃圾辨认模型,但一个问题随之而生,对于厨余垃圾的辨认须要比拟高的AI算力,如果回传到云端计算,就须要公司添置大量的服务器、GPU卡等资源,这极大的减少了利润自身薄如刀锋的垃圾回收行业的老本。 就在这个时候,飞桨工程师给他支招,不须要购买宏大的AI计算设施,只须要一个百度的“EdgeBoard嵌入式AI计算卡”再搭配两个一般的摄像头就能够解决问题。 当杜一品把不到2000元的一块EdgeBoard计算卡交融进了蔚澜的垃圾分类柜后,他说了一句很感概的话:“咱们的设施老本只减少了大概2-3%,就让咱们从自动化时代进入了人工智能时代,不得不说,这样的技术才是产业落地真正须要的技术。” 事实上,百度飞桨的价值正在于此,它依据理论需要预制了大量能够灵便搭配的解决方案,即便是宁波蔚澜这样全公司只有极少数懂AI的技术人员的企业,也能够借助飞桨丰盛的产品和生态,从软件到硬件、从训练到部署,搞定整个设施的AI化,企业只须要极低的老本,就把公司带到了一个新的倒退境界。 范世杰因此很有感概的说,降级到第三代之后,宁波市场上,根本就没有咱们的对手了,这就是AI的力量。 其实,宁波蔚澜只是崛起的垃圾回收产业大军中的一员。 垃圾分类能够使垃圾资源利用收益更大化,给产业和社会发明更多价值,具备鼎力推广的必要性。从产业链协同角度而言,前端的垃圾分类服务、中端的垃圾分类转运、终端的厨余垃圾处理、渗滤液处理、垃圾焚烧等相干企业均将从中受害。 2不再只是“先行者” 一家企业,只有1个或很少几个懂AI的人员在做先导,对于这种景象,百度团体副总裁吴甜称之为“AI先行者”阶段。 对于AI落地,吴甜在分享飞桨通过与产业搭档的宽泛单干中所察看到的落地实际门路时,把这条路描述为三个阶段,也就是先行者探路阶段、工作坊利用阶段和工业大生产阶段。 吴甜发现,企业中的AI先行者,往往既不是一线业务人员,也不是高层管理者,而是公司内的一些资深工程师。他们懂业务、懂场景、有想法,想要冲破传统的业务现状,心愿借助AI的力量走出一条不一样的路。 咱们所说的垃圾分类行业,就是这样一个典型场景。 垃圾分类宏大的市场空间,吸引了投资人和创业者纷纷进场,成为当下创投行业的一大热门。企查查数据显示,我国垃圾分类相干的企业注册量出现疾速减少的趋势,2016年垃圾分类相干企业注册量有余1000家,2020年的注册量为3775家。 然而,能够想见的是,传统的垃圾分类企业要在全社会AI人才存在较大缺口的背景下,招募到有肯定程度的AI开发专才,是有显著的艰难的。 而对于这种状况,飞桨EasyDL、BML等低门槛的企业级AI开发工具,就极大的升高了垃圾分类企业的开发难度,呈现了“一个人能撑起一家企业的”的状况。 例如,宁波蔚澜的AI技术总监就通知笔者,在与飞桨EasyDL单干之前也考查过别的公司,包含阿里、华为及国外的平台,最终发现飞桨EasyDL绝对更好用,更人性化,他说:“EasyDL最大的益处,就是不须要浅近的算法根底和深度学习常识,也能够去操作它。集成到零碎里也很不便。” 3以生态能力反碎片化 事实上,EasyDL能提供端到端残缺的解决方案,包含用于数据服务的EasyData和用于边缘计算的EdgeBoard硬件等。 不得不提及的是,EasyDL能够在数据量较小的状况下依然获得不错的模型成果,这对于很多处于「投石探路」阶段的企业有很大的现实意义。 例如和中国香港的屈臣氏单干的深圳归谷智能公司,2019年接到香港环保署的我的项目,要做一个辨认瓶子的我的项目。尽管看起来简略,但理论中瓶子的形态各异。归谷智能一开始应用的是其余开源代码,但识别率有余六成,但在换为EasyDL之后,短时间达到了准确率90%以上。 令归谷智能的技术人员感到诧异的是,训练中只用了100多个瓶子、800多张照片,用EasyDL训练后的识别率、准确率,就差不多达到实战要求,“这个算法听起来不难,但咱们发现目前国内上同类算法能达到相似成果的公司预计也就是2、3家,其中有一个超难的进阶试验是,把两个高度相似的瓶子的条码调换,要求可能辨认。这个试验里只有用了EasyDL的机器辨认进去了,别的公司的设施一个都没有辨认进去。” 这典型的体现了在小数据量的状况下,EasyDL的训练成果。 其实,从以上几个故事中,咱们不难发现一些共性,那就是尽管场景很碎片化,但理论的实际难度却很高。 在目前AI落地的浪潮中,有一个存在争议的畛域就是,对于过于碎片化的场景,到底如何「反碎片化」,是用更多的业余人员+老本更高的定制化计划,抑或用学习曲线更低、企业业务人员本人稍加训练就能够上场的EasyDL。 从这些故事中咱们得出的论断是,让企业的开发人员本人具备AI能力无疑是最好的反碎片策略,但这必须建设在所依靠的深度学习平台的高度产业化上,在这个过程中,除了EasyDL、BML外,笔者还见到了犹如电商页面一样的EdgeBoard的选购页面,百度飞桨就是通过不放过每一个痛点,把通过上万个场景的千锤百炼的模型,与实际过程中能够遇到的数据问题、软硬件整合问题,都提供了端到端的一站式解决,才具备了残缺的反碎片能力。 垃圾分类只是咱们整个社会「数智化」的一个缩影,当这么传统的畛域也开始让AI开始施展魔力之时,咱们间隔AI融入工业大生产的指标,仿佛又近了一些。 百度AI开发者社区https://ai.baidu.com/forum ,为全国各地开发者提供一个交换、分享、答疑解惑的平台,让开发者在研发路上不再“孤军奋战”,通过一直地交换与探讨找出更好的技术解决方案。如果你想尝试各种人工智能技术、开辟利用场景,赶快退出百度AI社区,你对 AI 的所有畅想,在这里都能够实现! 扫描下方二维码,增加小助手微信「京东卡、小度定制周边、神秘礼盒、行李箱」等更多福利你来拿~

September 9, 2021 · 1 min · jiezi

关于正则表达式:正则表达式知识点归纳

什么是正则表达式?正则表达式是由一个字符序列造成的搜寻模式。当你在文本中搜寻数据时,你能够用搜寻模式来形容你要查问的内容。正则表达式能够是一个简略的字符,或一个更简单的模式。正则表达式可用于所有文本搜寻和文本替换的操作。 正则表达式创立字面量(间接量)// 在一对反斜线中写正则表达式内容,如/abc/// 正则表达式外面不须要加引号 不论是数字型还是字符串型var pattern=/正则表达式/修饰符;var pattern=/qwer/igm;构造函数//结构正则表达式的实例,如new RexExp('abc')//外部传入的参数为字符串/字符串的变量var reg =new RegExp("正则表达式","修饰符")var reg =new RegExp("hello","g");字符的分类一般字符 字母、数字、下划线、汉字、没有非凡含意的符号(,;!@等) 实际上不是特殊字符的字符都是一般字符 特殊字符 \:将特殊字符本义成一般字符 模式修饰符 i:ignoreCase,匹配时漠视大小写 m:multiline,多行匹配 g:global,全局匹配 字面量创立正则时,模式修饰符写在一对反斜线后 正则表达式实例办法exec---->>可用来匹配字符串中合乎正则表达式的字符串如果匹配到,返回值是一个result数组:[匹配的内容,index: 在str中匹配的起始地位,input: 参数字符串,groups: undefined],r如果匹配不到则返回null 例如: var str = 'hello world hello';var reg1 = /hello/;var reg2 = /hello/g; //g示意全局匹配,也就是会匹配到str中所有满足正则表达式条件的字段var reg3 = /exe/g;console.log(reg1.exec(str)); //[ 'hello', index: 0, input: 'hello world hello', groups: undefined ]console.log(reg2.exec(str)); //[ 'hello', index: 0, input: 'hello world hello', groups: undefined ]console.log(reg3.exec(str)); // null //str中并不存在exe字段,所以输入null// 如果是全局模式的正则验证 还能够应用循环进行输入var reg = /hello/g;var str = 'hello world hello hello good';while(true) var result = reg.exec(str); if(!result){ break; } console.log(result[0],result["index"],reg.lastIndex); //hello 18 23}须要留神的中央就是 ...

September 1, 2021 · 3 min · jiezi

关于正则表达式:人人皆可成为AI开发者百度世界大会官宣百度松果学堂成立

8月18日,百度联结央视新闻举办“世界大会2021”大会,全景出现 AI 赋能千行百业和百姓生活。会上,百度 CTO 王海峰发表成立百度松果学堂,打造源于产业的 AI 人才培养平台,致力于让每个人都能更便捷地获取 AI 常识,学习 AI 技术。 ▲ 百度 CTO 王海峰发表成立百度松果学堂 作为业界最受注目的科技盛会之一,本届百度世界大会采纳 XR、AR、虚构场景、3D 出现等新技术,集中展现了百度在智能出行、AI 产业利用、芯片研发等方面的最新成绩。 在技术革新与利用落地的背地,是对人才的需要。当下,AI 技术创新沉闷、产业利用规模不断扩大,各行各业须要大量的、不同档次的开发者。百度 CTO 王海峰认为,人才培养是一件须要长期投入的事,“咱们心愿通过百度松果学堂为我国 AI 人才培养做出一点奉献。” 百度松果学堂是一个源于产业实际的 AI 人才培养平台,它集 AI 根底课程、实际教学、技术比赛、产业实训、科研基金等资源于一体,聚焦学界与产业界的各类需要,汇聚工业届和学界顶尖专家智库,通过技术赋能高校教育和行业利用,全方位保障各阶段开发者的 AI 学习与实际。 据理解,百度松果学堂将面向中小学生提供多类 AI 课程内容、科普书籍、趣味竞赛;面向大学生提供对应 AI 课程、技术比赛、共建的高校实训室和产业学院等;面向高校教师专门安顿对口的 AI 师资培训,并提供大量算力资源辅助一线老师教学;面向企业开发者,不仅提供与产业紧密结合的阶段性 AI 课程,还有主动驾驶、智能云、区块链等相干细分畛域的培训内容。 除此之外,百度松果学堂还筹备了面向各类人群的 AI 配套教材、AI 技术利用比赛、多畛域学习社区和丰盛的学习基金,打算与10+学会、100+政府机构、1000+院校、100000+企业独特携手,打造 AI 人才培养新生态,为中国 AI 产业倒退晋升造血力。 作为国内 AI 头雁,百度始终在踊跃布局“人工智能+X”复合型人才培养,从2011年起就正式提出凋谢钻研打算,2015年1月正式改名为百度松果打算,心愿通过与高校的专家学者单干,钻研有价值的企业前沿技术问题。此次百度松果学堂的成立,不仅是对百度过往 AI 人才培养动作的迭代降级,也为百度将来打算造就500万 AI 产业和技术人才厘清了方向,致力于让“人人皆可成为 AI 开发者”成为事实。 百度AI开发者社区https://ai.baidu.com/forum ,为全国各地开发者提供一个交换、分享、答疑解惑的平台,让开发者在研发路上不再“孤军奋战”,通过一直地交换与探讨找出更好的技术解决方案。如果你想尝试各种人工智能技术、开辟利用场景,赶快退出百度AI社区,你对 AI 的所有畅想,在这里都能够实现! 扫描下方二维码,增加小助手微信「京东卡、小度定制周边、神秘礼盒、行李箱」等更多福利你来拿~

August 23, 2021 · 1 min · jiezi

关于正则表达式:正则^

号外公众号的名字还是简略易懂,一看起来就晓得是干嘛的,尽管CodeNone不错,但其实是模拟一个公众号的前辈,而且英文总是有点不难受。为了更加的本人一点,特改名为 咖啡编程两个含意,一个是cafe babe,一个是排汇宇宙能量,刚刚好全笼罩本身的状况,dddd。注释是不是到处可见的正则表达式 是不是很艳羡他人熟练地应用正则表达式而本人不会 是不是想要入门正则表达式要么是长视频要么是一本书 是不是感觉这种形式看着很营销,很不难受 没错,上述除了正则表达式这五个字,其余全是废话,接下来要说的可能不肯定很全,然而相对能达到28准则,也就是把握20%的常识应答80%的工作场景。然而,要想真正把握这5个字,无他,唯手熟而 正则表达式所有都是紧挨着的,所有都是字符,摈弃掉“加空格丑陋,应用+号进行拼接”的想法根底写什么匹配什么 cat =>I have some pets, <u>cat</u>s, dogs and pigs. ⭕️ Cat => The cat sat on the mat. ❌ 123 => 56789<u>123</u>45 ⭕️ 123 => 12456 ❌ 元字符这也是网上的说法,其实依照我的来就是特殊字符 . * + ?.示意匹配除换行外任一字符.at => 示意at紧跟着某个字符 => The <u>cat</u> <u>sat</u> on the <u>mat</u>. => 有3处匹配 c.t => 示意c紧跟着某个字符紧跟着t => The <u>cat</u> sat on the mat. => 有1处匹配 *匹配后面的表达式0次或者屡次[a-z]* => 示意匹配0个或者多个字符 => T<u>he cat sat on the mat</u> => 有13处匹配 ...

August 22, 2021 · 2 min · jiezi

关于正则表达式:百度世界大会2021-与时代共振AI让生活更好

8月18日,以“AI 这时代,星辰大海”为主题的2021百度世界大会在百度 App、央视新闻客户端等平台同步直播。本次大会由总台央视主持人撒贝宁负责主持,在3个小时的直播中活泼展现百度人工智能在出行、生存、产业、自主翻新等畛域如何改善社会民生。百度创始人董事长兼 CEO 李彦宏在直播中示意:“AI,也是爱,是技术和温度联合在一起。”“让每一个人都感触到技术带来的扭转,这就是技术的价值。” 百度创始人、董事长兼 CEO 李彦宏与撒贝宁在央视直播间 作为业界最受注目的科技盛会,百度往年最新的技术成绩集中亮相:通过8年倒退,百度 Apollo 从技术验证阶段进入到规模化商业经营阶段,公布具备跨时代意义的百度“汽车机器人”和无人车出行服务平台“萝卜快跑”;百度挪动生态的外围翻新和服务化新进展失去全面展示,语音搜寻、视觉搜寻等智能搜寻能力和智能服务能力继续进化,可精确辨认快语速、中英文混淆、多轮发问、轻声搜寻及满足各种场景下的智能服务需要;小度围绕本身 AI 语音助手核心技术劣势,间断公布4款智能新品,构建起全场景智能生存;依靠“云智一体”的独特劣势,百度智能云全场景赋能减速产业智能化降级;百度 AI 技术多年积攒和产业实际的集大成百度大脑降级至7.0,百度自研昆仑 AI 芯片公布第2代产品,推动百度在 AI 畛域继续翻新。 本次大会是总台首档挪动端 4K 直播节目,直播间内更是搭建了38米x5米的 8K 超高清巨型弧屏,通过 AI+VR,打造多个沉迷式场景,带用户体验裸眼 3D 的舞台效果。通过直播间和外景地的实时联动,勾画出 AI 扭转出行、生存、产业的蓝图,将百度最新的 AI 成果展当初观众眼前,为全国观众带来一场全民 AI 科普盛宴。龚俊数字人现场唱跳神曲、金晨与百度无人车拍出“时尚大片”、连线国家跳水队周继红揭晓“梦之队”中的“AI 教练”、撒贝宁与祝融号数字人“吟诗作对”等彩蛋,让网友们大呼过瘾。 百度汽车机器人可能通过三重能力服务于人:首先具备 L5 级主动驾驶能力,不仅无需人类驾驶,而且比人类驾驶更平安;其次具备语音、人脸识别等多模交互能力,剖析用户潜在需要,被动提供服务;此外汽车机器人还具备自我学习和一直降级能力,是服务各种场景的智慧体。 \百度创始人、董事长兼 CEO 李彦宏与撒贝宁体验汽车机器人 联合了 Apollo 过来两年的经营实际,百度推出无人车出行服务平台“萝卜快跑”,能向公众提供商业经营和多元化增值服务,减速全民无人化出行时代到来。在全国多地,百度 Apollo 无人车正为公众提供无人化出行服务,截至2021年上半年,百度 Apollo 主动驾驶在北京、广州、长沙、沧州四城凋谢面向公众的出行服务,累计接待乘客超过40万人次。百度 Apollo 已取得336张主动驾驶测试牌照,曾经在全国30个城市发展主动驾驶测试,路测里程超过1400万公里,主动驾驶专利数量超过2900件。 Apollo 赋能车企智能化则推动主动驾驶走进公众生存。百度团体资深副总裁、智能驾驶事业群总经理李震宇示意:“主动驾驶能力曾经成为智能汽车的决胜洼地。”通过多年技术积攒,百度 Apollo 一直将主动驾驶外围劣势开释到汽车智能化畛域,助力车企打造具备继续进化能力的智能汽车,为用户提供“开车释怀”“停车省心”“用车顺心”的智能汽车体验。 百度团体资深副总裁、智能驾驶事业群总经理李震宇介绍 Apollo 业务 除了打造“智慧的车”,百度还致力于与“聪慧的路”协同,打造兼容当下面向未来的 AI 出行解决方案。百度在保定84个路口部署了 AI 智能信控系统,造成的一条条“绿波带”使车辆行程工夫均匀缩短约20%。目前,百度 ACE 智能交通正在深耕智能网联、智慧交管、智慧高速、智慧停车多条赛道,相干成绩已在北京、广州、上海、重庆近30多个城市落地。 领有5.8亿月活的百度 App 背地,AI 推动搜寻朝人格化和服务化两大方向倒退。百度团体执行副总裁沈抖在直播中称,百度 App 语音辨认准确率曾经达到98%,超过人耳程度。不论是轻声、快语速、长问题、还是中英文夹杂、粤语、轻方言,百度 App 都能帮忙找到最好答案。百度 App 代言人龚俊不仅亲自上阵,通过一个短片带来 AI 生存的体验介绍,全面展示了百度 App 带来的智能生存,还专门定制了一个数字人在大会上互动表演,AI 科技感十足。此外,龚俊专属语音包也在百度 App 上线,网友能够在百度 App 上抉择龚俊的声音播报新闻。不仅仅是百度 App,百度旗下难看视频、百度衰弱、百度网盘、百度一刻相册等一系列“AI 高浓度”产品造成的挪动利用矩阵,都在用 AI 让用户“百度一下,生存更好”。 ...

August 19, 2021 · 1 min · jiezi

关于正则表达式:正则表达式中一些难理解的匹配方式

(?:pattern)()示意捕捉分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标记,第一个呈现的分组的组号为1,第二个为2,以此类推 (?:)示意非捕捉分组,和捕捉分组惟一的区别在于,非捕捉分组匹配的值不会保存起来 import rea = "123abc456ww"pattern = "([0-9]*)([a-z]*)([0-9]*)"print(re.search(pattern,a).group(0,1,2,3))pattern = "(?:[0-9]*)([a-z]*)([0-9]*)"print(re.search(pattern,a).group(0,1,2)) 能够看到 (?:[0-9]) 匹配的第一个 [0-9] 没有保留下来,即没有保留匹配到的“123”,而([0-9]*)则保留了下来。 python中group(0)返回匹配到的整体 (?:pattern)在应用 "或" 字符 (|) 来组合一个模式的各个局部是很有用。例如,'industr(?:y|ies)' 就是一个比 'industry|industries' 更简略的表达式。因为咱们独自存储下 “y” 或者 “ies” 没有什么意义 a = "British industry"pattern = "industr(?:y|ies)"print(re.search(pattern,a).group(0))pattern = "industr(y|ies)"print(re.search(pattern,a).group(0, 1))//group(1)会报错,因为没有保留捕捉到的“y”(?=pattern)正向必定预查(look ahead positive assert),匹配pattern后面的地位。简略说,以 xxx(?=pattern)为例,就是捕捉以pattern结尾的内容xxx 1、这是一个非获取匹配,也就是说,该匹配不须要获取供当前应用。 industr(?=y|ies) ---> "industr"2、预查不耗费字符,也就是说,在一个匹配产生后,在最初一次匹配之后立刻开始下一次匹配的搜寻,而不是从蕴含预查的字符之后开始。 (?!pattern)正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不须要获取供当前应用。 简略说,以 xxx(?!pattern)为例,就是捕捉不以pattern结尾的内容xxx 例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不耗费字符,也就是说,在一个匹配产生后,在最初一次匹配之后立刻开始下一次匹配的搜寻,而不是从蕴含预查的字符之后开始。 (?<=pattern)反向(look behind)必定预查,与正向必定预查相似,只是方向相同。 简略说,以(?<=pattern)xxx为例,就是捕捉以pattern结尾的内容xxx。 例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。 (?<!pattern)简略说,以(?<!pattern)xxx为例,就是捕捉不以pattern结尾的内容xxx。 反向否定预查,与正向否定预查相似,只是方向相同。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。 贪心匹配和非贪心匹配var str="abcaxc";var p=/ab.*c/;//贪心匹配str.match(p);//abcaxcvar p2 = /ab.*?c/; //非贪心匹配str.match(p2);//abc贪心匹配:正则表达式个别趋向于最大长度匹配,也就是所谓的贪心匹配。如下面应用模式p匹配字符串str,后果就是匹配到:abcaxc(ab.*c)。非贪心匹配:就是匹配到后果就好,就少的匹配字符。如下面应用模式p2匹配字符串str,后果就是匹配到:abc(ab.*?c)。

August 8, 2021 · 1 min · jiezi

关于正则表达式:前端中正则表达式的相关方法

str.match(regexp)办法str.search(regexp)返回第一个匹配项的地位,如果未找到,则返回-1 var result = 'javascript'.search(/script/) console.log(result) // 4str.replace(str|regexp,str|func)办法str.replace(str|regexp,str|func)用以执行检索与替换操作。如果正则表达式中设置了修饰符g,那么源字符串中所有与模式匹配的子串都将替换成第二个参数指定的字符串;如果不带修饰符g,则只替换所匹配的第一个子串。 console.log('12-34-56'.replace(/-/, ':')) // 12:34-56console.log('12-34-56'.replace(/-/g, ':')) // 12:34:56str.split(regexp|substr,limit)应用正则表达式(或子字符串)作为分隔符宰割字符串 console.log('12-34-56'.split(/-/)) // ["12", "34", "56"]str.match(regexp)在字符串str中找到匹配regexp的字符,它有3种模式:(1)如果 regexp 不带有 g 标记,则它以数组的模式返回第一个匹配项,其中蕴含分组和属性 index(匹配项的地位)、input(输出字符串,等于 str) let str = 'I love JavaScript'let result = str.match(/Java(Script)/)console.log(result) // ["JavaScript", "Script", index: 7, input: "I love JavaScript", groups: undefined](2)如果 regexp 带有 g 标记,则它将所有匹配项的数组作为字符串返回,而不蕴含分组和其余详细信息。 let str = 'I love JavaScript'let result = str.match(/Java(Script)/g)console.log(result) // ["JavaScript"](3)如果没有匹配项,则无论是否带有标记 g ,都将返回 null。 RegExp对象定义了两个用于执行模式匹配的办法regexp.test(str)它的参数是一个字符串,如果蕴含正则表达式的一个匹配后果,则返回true let str = 'I love JavaScript'console.log(/love/i.test(str)) // trueregexp.exec(str)和后面介绍的String.match()办法类似,它的参数是一个字符串。依据正则表达式是否带有标记g,它的行为有所不同。如果没有g,那么 regexp.exec(str) 返回的第一个匹配与 str.match(regexp) 完全相同;如果有标记g,那么调用 regexp.exec(str) 会返回第一个匹配项,并将紧随其后的地位保留在属性 regexp.lastIndex 中。 下一次同样的调用会从地位 regexp.lastIndex 开始搜寻,返回下一个匹配项,并将其后的地位保留在 regexp.lastIndex 中。这种非凡的行为使咱们能够在用正则表达式匹配字符串的过程中重复调用exec()。 ...

August 8, 2021 · 1 min · jiezi

关于正则表达式:在线正则表达式大全测试

在线正则表达式大全测试在线正则表达式大全测试 本工具提供在线正则表达式的测试,反对替换,客户端实时计算,数据实时更新。 https://tooltt.com/regexp/

July 28, 2021 · 1 min · jiezi

关于正则表达式:祝贺中国跳水队夺金百度智能云挺敢做梦的人

“总分326.40分!远超第二名25.62分!祝贺施廷懋、王涵毫无悬念地夺得跳水男子双人3米板我的项目金牌!祝贺中国跳水队!”东京奥运会传来喜报。 里约奥运会男子3米板单人和双人双料冠军施廷懋携手世界冠军王涵出战,最终这对组合以326.4分排名第一,为中国跳水“梦之队”夺得首金,这也是中国代表团在本届奥运会的第4金。 两位跳水运动员的杰出体现,放弃了中国跳水在男子跳板我的项目上的统治力,为中国跳水“梦之队”博得开门红! 此前,这被认作是“理所应当”的金牌。中国跳水“梦之队”自1984年洛杉矶奥运会以来,曾经为中国奥运军团奉献了40枚金牌,在国内所有静止我的项目中高居榜首,备受瞩目;从参赛阵容来看,10名选手中有9人是奥运冠军或世界冠军,实力强劲,这无疑将公众的期待值拉满。 本届奥运会跳水首金获得者——施廷懋和王涵都领有世界顶尖程度,被寄予厚望。两人曾在2010年广州亚运会搭档摘得双人我的项目的金牌,自2018年11月再次搭档出战双人较量以来,施廷懋和王涵所向无敌,包揽了全副国内外赛事的冠军,是公认的默契搭档。现在,两位30岁“老将”携手登上东京奥运会金牌领奖台,升国旗唱国歌,光荣加身! 但在聚光灯的背地,幻想的实现并非一日之功。跳水静止作为一项超高速静止,从起跳到落水只有2秒钟工夫。随着跳水我的项目倒退迅猛,动作难度也越来越大。这意味着在2秒钟内,运动员们须要更加刻苦的训练,打磨实现更高难度的动作,一直冲破自我成为“难度王”,才有机会取得更高的技术分并突破世界纪录。 在此之际,百度智能云正式公布《2秒追梦》品牌片,记录这些可恶的人背地的故事,挺敢做梦的人。 视频链接: https://baidu-ai-ar-151238020... 在运动员眼里,那些咱们不以为然、常被疏忽的2秒钟,是他们一直冲破体能极限后的决胜时刻,是展示台下十年苦练本事的高光霎时,也是跳水运动员翻身转体后的完满一跳。为此,中国跳水队运动员肩负国家荣誉,不甘平庸、永不言败,疫情期间从不停训,充分利用训练的每一分钟,更在惯例备战外做了新的尝试。 在古代体育谋求高效、精准的趋势下,使用 AI 技术辅助剖析、训练调整,成为了各国当先运动队晋升实力和问题的大趋势,体育事业正在迈入迷信智能训练的新阶段。 中国跳水队在赛前训练中,百度智能云为其打造了国内首个“3D+AI”跳水训练零碎,笼罩跳水训练的各个环节。针对跳水训练中的痛点,百度智能云基于“3D+AI”技术,首次实现“云-边-端”软硬一体的 AI 辅助训练零碎,通过 AI 技术对训练视频进行摘要、动作抽取、姿态纠正等解决,疾速进行演绎整顿,冲破了体育运动定量评估与数据分析的难题,将竞技体育更精细化地定格在工夫和空间维度,让体育训练更加迷信、智能、正当、无效,实现了“看得清”、“看得准”、“看得全”和“看得懂”四大外围能力。 这几个月来,零碎辅助训练的成果突出,运动员的训练效率晋升了20%。在跳水队运动员不懈练习、全力以赴进步百分之一甚至千分之一问题的同时,百度智能云打造的“国家队 AI 教练”更是炼就了“火眼金睛”和“最强大脑”,看清细节、快速反应、实时打分、超强记忆,这是百度智能云作为技术撑持,对跳水队的最强助攻。 分秒之间见问题,是跳水较量的性质;实现“一根针”入水的完满一跳,则是跳水队的终极目标。当“冠军模型”遇上“王牌数据”,敢为人先的中国跳水队拥抱科技、改革翻新,用先进的技术让日常训练更为迷信无效。 百度智能云有幸成为跳水健儿的弱小助力,必将施展所能,用技术为中国跳水“梦之队”精益求精,共赴夺冠征程。今后,百度智能云将持续把 AI 技术与各类静止联合,辅助体育健儿们在赛场上一直超越自我,获得佳绩,力挺这群敢做梦的人! 百度AI开发者社区https://ai.baidu.com/forum ,为全国各地开发者提供一个交换、分享、答疑解惑的平台,让开发者在研发路上不再“孤军奋战”,通过一直地交换与探讨找出更好的技术解决方案。如果你想尝试各种人工智能技术、开辟利用场景,赶快退出百度AI社区,你对 AI 的所有畅想,在这里都能够实现! 扫描下方二维码,增加小助手微信「京东卡、小度定制周边、神秘礼盒、行李箱」等更多福利你来拿~

July 26, 2021 · 1 min · jiezi

关于正则表达式:在线正则表达式可视化工具

在线正则表达式可视化工具在线正则表达式可视化工具 本工具提供在线正则表达式的测试,反对替换,客户端实时计算,数据实时更新。 https://tooltt.com/regulex/

July 25, 2021 · 1 min · jiezi

关于正则表达式:正则规则与常用正则

// 表达式 .* 就是单个字符匹配任意次,即贪心匹配。 // 表达式 .*? 是满足条件的状况只匹配一次,即最小匹配.// 必定逆序环视 (?<=expresion) 子表达式可能匹配左侧文本// 否定逆序环视 (?<!expresion) 子表达式不能匹配左侧文本// 必定程序环视 (?=expresion) 子表达式可能匹配右侧文本// 否定程序环视 (?!expresion) 字表达式不能匹配右侧文本// 联合上述 (?=.*expresion) 必须匹配左侧表达式// . 匹配除换行符以外的任意字符// \w 匹配字母或数字或下划线// \s 匹配任意的空白符// \d 匹配数字// \b 匹配单词的开始或完结// ^ 匹配字符串的开始// $ 匹配字符串的完结// * 反复零次或更屡次// + 反复一次或更屡次// ? 反复零次或一次// {n} 反复n次// {n,} 反复n次或更屡次// {n,m} 反复n到m次// \W 匹配任意不是字母,数字,下划线,汉字的字符// \S 匹配任意不是空白符的字符// \D 匹配任意非数字的字符// \B 匹配不是单词结尾或完结的地位// [^x] 匹配除了x以外的任意字符// [^aeiou] 匹配除了aeiou这几个字母以外的任意字符// /g 示意该表达式将用来在输出字符串中查找所有可能的匹配,返回的后果能够是多个。如果不加/g最多只会匹配一个// /i 示意匹配的时候不辨别大小写,这个跟其它语言的正则用法雷同// /m 示意多行匹配。什么是多行匹配呢?就是匹配换行符两端的潜在匹配。影响正则中的^$符号// /s 与/m绝对,单行模式匹配。// /e 可执行模式,此为PHP专有参数,例如preg_replace函数。// /x 疏忽空白模式。// 这些修饰符是能够混合应用的。例如 /ig、/ie等。const regExp = { //局部 字母、数字、+*-/_三种中的两种组成 part_letterNumberSymbol: /^(([0-9]+[a-zA-Z]+)|([0-9]+[\/\*\-\+\_]+)|([a-zA-Z]+[0-9]+)|([a-zA-Z]+[\/\*\-\+\_]+)|([\/\*\-\+\_]+[a-zA-Z]+)|([\/\*\-\+\_]+[0-9]+))([a-zA-Z]*[\/\*\-\+\_]*[0-9]*)+$/, //必须 字母、数字 required_letterNumber: /^(?=.*[0-9])(?=.*[a-zA-Z])(.{2,})$/, //只能 字母、数字 can_numberAndletter: /^[A-Za-z0-9]+$/, // 只能 字母、数字、下划线 can_number_letter_Underline: /^[A-Za-z0-9\_]+$/, //只能 字母 can_letter: /^[A-Za-z]+$/, //只能 字母、汉字 can_numberAndcharacters: /^[a-zA-Z\u4e00-\u9fa5]+$/, //只能 汉字、字母、数字 can_letterNumberChinese: /^[A-Za-z0-9\u4e00-\u9fa5]+$/, //只能 汉字、字母、数字、下划线 can_charactersNumbersUnderscores: /^[\w\u4e00-\u9fa5]+$/, //英文结尾,只能英文小写,数字,下划线 startLetter_number_letter_Underline: /^[a-z]+[a-z0-9\_]*$/, // 手机号正则,用处例如:验证手机号 phone: /^1\d{10}$/, // 微信号码 wechat: /^[a-zA-Z]([-_a-zA-Z0-9]{5,20})+$/, // 邮箱正则 email: /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/, // IP地址 ip: /^(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)$/, // 非数字结尾 beginNoNumber: /^\D{1}.*$/, // 经纬度 lonLat: /^[+-]?\d{1,3}(\.\d{1,6})?,[+-]?\d{1,3}(\.\d{1,6})?$/, /* 非法uri*/ urlregex: /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/, // 浮点数 能够带+-符号 floatNumber: /^[-+]?\d+(\.\d+)?$/, //座机号码 landline: /^0[0-9]{2,3}-[0-9]{8}$/, //车牌号 carPlate: /^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$/, //支付宝 aliPay: /^[/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*][1\d{10}]$/, //财付通 tenPay: /^[/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*][1\d{10}]$/, //中国身份证 chinaIdCard: /^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/, //特殊字符 specialChar: /[`~!@#\$%\^\&\*\(\)_\+<>\?:"\{\},\.\\\/;'\[\]]/im}

May 28, 2021 · 1 min · jiezi

关于正则表达式:正则表达式字母数字下划线和一些特殊字符

(/^[-\w+!@#$%^&*]*$/).test('ig-_ades2vel') 除了非中文字符,其余字符按需增加到中括号中 另:element中form加rules检测,数据绑定要把v-model换成:model否则会存在自身曾经有值但表单还有报错的状况

May 28, 2021 · 1 min · jiezi

关于正则表达式:正则表达式匹配

蕴含且不蕴含匹配

May 28, 2021 · 1 min · jiezi

关于正则表达式:个人学习系列-正则表达式

整顿一下正则表达式的速配内容一、校验数字的表达式数字:^[0-9]*$n位的数字:^\d{n}$至多n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零结尾的数字:^(0|[1-9][0-9]*)$非零结尾的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的负数或正数:^(\-)?\d+(\.\d{1,2})?$负数、正数、和小数:^(\-|\+)?\d+(\.\d+)?$有两位小数的正实数:^[0-9]+(.[0-9]{2})?$有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$非负整数:^\d+$ 或 ^[1-9]\d*|0$非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$二、校验字符的表达式汉字:^[\u4e00-\u9fa5]{0,}$英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$长度为3-20的所有字符:^.{3,20}$由26个英文字母组成的字符串:^[A-Za-z]+$由26个大写英文字母组成的字符串:^[A-Z]+$由26个小写英文字母组成的字符串:^[a-z]+$由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}中文、英文、数字包含下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$中文、英文、数字但不包含下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$能够输出含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+禁止输出含有~的字符[^~\x22]+其它: .*匹配除 \n 以外的任何字符。/[\u4E00-\u9FA5]/ 汉字/[\uFF00-\uFFFF]/ 全角符号/[\u0000-\u00FF]/ 半角符号三、非凡需要表达式Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}身份证号(15位、18位数字):^\d{15}|\d{18}$短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$帐号是否非法(字母结尾,容许5-16字节,容许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$明码(以字母结尾,长度在6~18之间,只能蕴含字母、数字和下划线):^[a-zA-Z]\w{5,17}$强明码(必须蕴含大小写字母和数字的组合,不能应用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$日期格局:^\d{4}-\d{1,2}-\d{1,2}一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$钱的输出格局:1.有四种钱的示意模式咱们能够承受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$2.这示意任意一个不以0结尾的数字,然而,这也意味着一个字符"0"不通过,所以咱们采纳上面的模式:^(0|[1-9][0-9]*)$3.一个0或者一个不以0结尾的数字.咱们还能够容许结尾有一个负号:^(0|-?[1-9][0-9]*)$4.这示意一个0或者一个可能为负的结尾不为0的数字.让用户以0结尾好了.把负号的也去掉,因为钱总不能是负的吧.上面咱们要加的是阐明可能的小数局部:^[0-9]+(.[0-9]+)?$5.必须阐明的是,小数点前面至多应该有1位数,所以"10."是不通过的,然而 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$6.这样咱们规定小数点前面必须有两位,如果你认为太刻薄了,能够这样:^[0-9]+(.[0-9]{1,2})?$7.这样就容许用户只写一位小数.上面咱们该思考数字中的逗号了,咱们能够这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$8.1到3个数字,前面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$备注:这就是最终后果了,别忘了+能够用*代替如果你感觉空字符串也能够承受的话(奇怪,为什么?)最初,别忘了在用函数时去掉去掉那个反斜杠,个别的谬误都在这里 其余xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$中文字符的正则表达式:[\u4e00-\u9fa5]双字节字符:[^\x00-\xff] (包含汉字在内,能够用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))空白行的正则表达式:\n\s*\r (能够用来删除空白行)HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太蹩脚,下面这个也仅仅能局部,对于简单的嵌套标记仍旧无能为力)首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (能够用来删除行首行尾的空白字符(包含空格、制表符、换页符等等),十分有用的表达式)腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))IP-v4地址:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b (提取IP地址时有用)校验IP-v6地址:(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))子网掩码:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))校验日期:^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$(“yyyy-mm-dd“ 格局的日期校验,已思考平平年。)抽取正文:<!--(.*?)-->查找CSS属性:^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}提取页面超链接:(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^" rel="external nofollow" ]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>提取网页图片:\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)提取网页颜色代码:^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$文件扩展名效验:^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$判断IE版本:^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$附表: ...

May 24, 2021 · 1 min · jiezi

关于正则表达式:记录正则表达式引发的血案

遇到问题前些日子在做线上验品抽检需要,在开发发动检测工作页面时遇到一个字段校验的诉求,具体要求:“用户能够填入多组 ID,每组 ID 能够由商品 ID 和 SKU ID 独特形成,也能够只由其中一种 ID 形成,两种 ID 之间通过冒号分隔;每组 ID 之间又须要通过英文逗号分隔”。这不就是一个表单字段格局校验场景吗?因而很天然的想到应用正则表达式来解决,在捣腾了几分钟之后写好一个正则表达式: /^(((d+:d+)+)|(,(d+:d+)+)|(d)+|(,(d+)+)){0,}$/在 chrome 浏览器控制台简略测试了一下顺利通过!很完满~ 可是打包发到日常环境后,测试妹子找到我反馈说“这个页面很卡,而且是卡死的那种!”。 定位问题通过排查后发现每次都是填入了商品 ID 之后产生的页面假死,于是判定问题应该是出在表单字段的 validator 函数,当我把这个 validator 函数正文之后发现页面恢复正常!然而这个 validator 函数是 formily 提供进去的钩子函数,钩子函数自身不会有问题,而且我在钩子函数外面的自定义逻辑也很简略,因而能够笃定问题出在正则表达式判断这里! 然而我在 chrome 控制台外面明明测试的很丝滑,怎么会呈现卡死呢?!于是让测试妹子把用例发我一看: 10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091,10253:23091 而后再把后面那段正则表达式语句进行可视化剖析: 原来是我本人的用例太过简略,基本没有触发到正则的性能问题。以前始终据说正则表达式可能会造成性能问题,但因为始终都没有真正遇到过,所以也没有真正上心去理解正则执行原理,于是乎触发到常识盲区造成这个 bug。 如何解决问题产生的起因尽管被定位到,然而我不太可能在短时间内写出一个合乎需要的高性能正则表达式,因为测试妹子还等着我修掉 bug 后持续往下走。于是我筹备先用一个长期计划来解决,长期计划的思路:把以后这个复杂度大的校验规定,合成为几个简略的校验规定,再把他们一起的后果串联起来。具体实现如下图: 把用户填入的很长很简单的字符串依照英文逗号为分隔符的规定先进行分组,而后再用一个简略的正则表达式去判断每组 ID 的格局是否满足,因为每组 ID 的长度都不长,所以不会触发性能问题。 在解决当务之急后,我就开始收集正则表达式相干的学习材料和博客,在 ATA 上搜寻到好几篇与我的问题高度类似的文章《一个由正则表达式引发的血案》、《一个正则表达式flag引发的血案》、《正则表达式的RegExp.test函数》,然而这些文章各有侧重点,而我冀望的是更加零碎和全面的学习材料。通过一番搜寻后,终于在豆瓣上发现了《精通正则表达式》这本书。不过我本人目前还没啃完,所以上面不会讲原理,等前面看完了再来写个读后感和引擎原理剖析~ 在看书的过程中我发现一个新问题:不是每个业务场景都须要咱们写出一个高性能的正则表达式,咱们在开发业务的时候更多想要的是“如何疾速发现性能低劣的正则表达式?”——简而言之,有一个工具能在咱们编写代码的过程中去剖析正则表达式的性能并给出反馈! 工具积淀带着下面的想法我去调研了 vscode 插件和 eslint 插件: vscode 插件生态中有很多 regex 相干的插件,不过大都是集中在如何疾速预览和如何疾速提供罕用的正则表达式eslint 插件生态提供了 eslint-plugin-optimize-regex、eslint-plugin-vuln-regex-detector,前者次要是在对现有的正则表达式提供优化倡议,没有做回溯危险校验;后者只做了回溯危险校验,并且很久没有保护了vscode 插件这条路相比于 eslint 插件要更重一些,而且不好落进团队标准外面,因而决定自研一个 eslint 插件集优化倡议和回溯危险于一体。 在正式落代码之前须要弄清楚两个问题: 如何度量正则表达式复杂度?如何智能地给出优化倡议?这两个问题对于正则入门级选手的我来说切实是太难,通过一番调研之后发现早就有前辈在钻研这些问题并且给出了一套理论依据——star height,以及一个成熟的正则表达式解决工具——regexp-tree。果然站在伟人的肩膀上不仅看得又高又远,而且代码撸得也飞快~ 花了半天工夫就实现了 eslint-plugin-analyze-regex 插件的第一个版本,运行成果如下: ...

April 1, 2021 · 1 min · jiezi

关于正则表达式:正则表达式小记

看《自制编程语言》中对正则有一个简略的介绍,现记录一下。如下一个正则表达式([1-9][0-9]*)|0|([0-9]+\.[0-9]+)[与]示意匹配此范畴内的任意字符。反对应用连接符的缩写。比方[1-9]与[123456789]是齐全一样的。最后面的圆括号的[1-9]代表匹配1~9中的任意一个数字,其后的[0-9]代表匹配0~9中的任意一个数字。之后的*,代表匹配后面的字符*0次或者屡次。因而,[1-9][0-9]*这个正则表达式,整体代表以1~9结尾(只有一位),后接0个以上的0~9字符。|代表“或”的意思。即后面的数字与0通过|分成两局部而后并列+是指匹配后面的字符一次或屡次[0-9]+就是指0~()的数字至多呈现一次.就指的是小数点,而是用\.,是因为须要本义,\就是本义符[0-9]+\.[0-9]+整体意思就是:0~9的数字至多呈现一次,后接小数点。后又接至多一位0~9数字[、]、*、+、.等这些在正则表达式中有非凡含意的字符称为元字符,元字符能够像上文那样用\或双引号进行本义

March 24, 2021 · 1 min · jiezi

关于正则表达式:正则表达式基础工具书篇-关于边界

写在之前:以下所有的元字符,匹配的不是理论的字符,而是一个“虚”的地位。 1. 整体边界1. 匹配起始地位的 ^^ 写在字符集中第一个方括号的后边,示意“非”。^ 写在整个正则表达式的最前边,则示意匹配输出字符串的起始地位,即结尾。简略的说,就是以什么什么为结尾。 比方,咱们想要通过正则表达式匹验证手机号码。 如果咱们应用正则表达式 1[35789]\d{9}去匹配,会把 00015599998888这样的字符串验证通过。因为咱们的确能够在这个字符串中,匹配出合乎这个正则的字符串。 单纯的为了避免在结尾多几位数的谬误手机号通过验证,咱们应该将正则表达式批改为 ^1[35789]\d{9}。即只有以 13 15 17 18 19结尾的,且能在其后匹配出9个数字的字符串,能够验证通过。 2. 匹配完结地位的 $$ 写在整个正则表达式的最初边,则示意匹配输出字符串的完结地位,即开端。简略的说,就是以什么什么为结尾。 返回上边的例子,正则表达式,曾经被优化为 ^1[35789]\d{9}。 然而仔细的人会发现,1559999888866666这样的字符串还是会验证通过。为了保障手机号只有11为,咱们应该将正则表达式批改为 ^1[35789]\d{9}$。 即只有以 13 15 17 18 19结尾的,且后边只有9个数字就完结的,能够验证通过。 3. \b 与 \B\b用来匹配单词(数字)的边界,比方单词与符号之间、单词与空格之间的地位等。用谨严一点的说法,就是\w和\W之间的地位(尚未讲究)。 虽说是边界,然而匹配的只是一个虚的地位(能够设想为\w与\W两个字符两头的那个缝隙),而不是理论的字符。 \B则反过来,匹配非单词的边界,即\w和\w之间的地位,或\W和\W之间的地位。也就是单词(数字)中两个相邻字符两头的那条缝隙,或者两个符号两头的那条缝隙。 同样,匹配的是一个虚的地位。 利用这两个符号,咱们最常做的,就是利用 replace,在字符串中插入字符。举一个最经典的例子,数字的三位分节法: //js"1234567890".replace(/\B(?=(?:\d{3})+$)/g,",")//"1,234,567,890"(?=(?:\d{3})+$)是一个正向预查,示意 咱们要匹配的\B,的后边的数字必须是三个一组三个一组(有起码一组)来结尾的。满足这样条件的,数字之间的缝隙(非单词边界),全副(正则后有全局修饰符g)替换(插入)为一个逗号。

March 4, 2021 · 1 min · jiezi

关于正则表达式:正则表达式基础工具书篇-所有关于的

?在正则表达式界领有特地高的位置。因为跟 ?相干的符号太多了。除了之前讲的「示意匹配次数0或1次」以及「示意非贪心匹配」之外,还有其它的作用,咱们一起码一码。 1. ?:用来示意子表达式非捕捉。用圆括号包裹的表达式,即子表达式,其匹配到的内容,默认状况下,也会被保留到内存中,以供应用。 比方咱们想要在一段HTML中,拿到一个残缺的a标签,还想要拿到这个a标签里的链接地址。正则表达式能够写为 \<a href\="(.*?)"\>\<\/a\>。在进行匹配时,括号内的匹配后果也会一起返回进去。返回后果的应用形式依据语言不同、应用的函数不同而异,大家可自行查阅。 如果咱们在进行匹配时,不须要这个a标签里的链接地址。正则表达式能够写为 \<a href\="(?:.*?)"\>\<\/a\>。 将不须要的子表达式设置为非捕捉模式,能够节俭内存。 2. ?=用来示意正向肯定预查。即满足后者条件的前者。借用一下经典例子,正则表达式 Windows(?=95|98) 会匹配到 Windows95或 Windows98中的 Windows,而不会匹配到 Windows2000、WindowsXP等字符串中的Windows。要留神,它只会匹配出 Windows。 3. ?!用来示意正向否定预查。即不满足后者条件的前者。正则表达式 Windows(?!95|98) 会匹配到 Windows2000、WindowsXP等字符串中的Windows,而不会匹配到 Windows95或 Windows98中的 Windows。要留神,它只会匹配出 Windows。 4. ?<=用来示意反向肯定预查。即满足前者条件的后者。正则表达式 (?<=95|98)Windows 会匹配到 95Windows或 98Windows中的 Windows,而不会匹配到 2000Windows、XPWindows等字符串中的Windows。要留神,它只会匹配出 Windows。 5. ?<!用来示意反向否定预查。即满足前者条件的后者。正则表达式 (?<!95|98)Windows 会匹配到 2000Windows、XPWindows等字符串中的 Windows,而不会匹配到 95Windows或 98Windows中的Windows。要留神,它只会匹配出 Windows。

March 4, 2021 · 1 min · jiezi

关于正则表达式:正则表达式基础工具书篇-匹配次数

*. 分组说匹配次数之前,先说说其余的。应用圆括号 ( ) 包裹字符内容,使其变成一个子表达式,执行匹配后,除了总匹配后果,子表达式匹配后果也会存入内存。这里括号的作用和四则运算中括号中的作用差不多,括号内的运算具备更高的优先级,并作为一个整体参加匹配运算。 1.用元字符确定匹配次数通过在单个字符或一个子表达式的前方,紧跟示意匹配次数的元字符,确定这个字符或者子表达式该当间断匹配的次数。 1. ?? 示意匹配0次或者1次,即要匹配的内容可有可无。例如正则表达式 (www\.)?sss.com,既能够匹配字符串 www.sss.com,也能够匹配 sss.com。 2. ** 示意匹配0次或者屡次,即匹配多少次都行。例如正则表达式 ax*b,能够匹配字符串 ab、 axb、 axxxxb、 axxxxxxxxxxxb等。 3. ++ 示意匹配1次或者屡次,即匹配多少次都行,然而至多得有一次。例如正则表达式 ax+b,能够匹配字符串 axb、 axxxxb、 axxxxxxxxxb等,然而不能匹配 ab。 4. 花括号应用花括号包裹自然数,来示意匹配的次数({m})。能够在两个自然数两头加上逗号来示意匹配两个数的区间范畴({m, n})。如果花括号内只有第一个自然数和一个逗号,则示意匹配 >= 第一个数的次数({m,})。例如:ce{3}b 只能够匹配字符串 ceeeb,ce{1,3}b 只能够匹配字符串 ceb、 ceeb、 ceeeb,ce{3,}b 能够匹配字符串 ceeeb、 ceeeeeeeb、 ceeeeeeeeeeeeeeeb等,但不能匹配字符串ceb、 ceeb。 2.贪心模式与非贪心模式在一个正则表达式中,一个字符对应的字符集越大,则满足匹配的状况就越多。如果这个字符的匹配次数越大,那么字符串中满足匹配的状况就越多。这个时候,最终的匹配后果应该如何抉择呢? 比方,用正则表达式 a.*b 去匹配字符串 abccbxxb,匹配后果应该是 ab、 abccb 还是 abccbxxb? 这个时候,须要依据贪心模式或者非贪心模式去判断。 贪心模式(默认模式),就是说,在满足正则匹配的状况下,取字符数最多的那个后果。非贪心模式,即反之,取字符数起码的那个后果。应用办法为,在示意匹配次数的元字符后加上一个 ?。 依据下面的概念,之前的问题,答案应该是 abccbbxxb。如果想要应用非贪心模式来匹配出 ab,则应该批改正则表达式为 a.*?b。 咱们来看一个更贴近事实的例子。咱们要取出一段HTML中a标签所蕴含的链接。假如这段HTML为: <a href="a.com"></a><div class="one">如过咱们应用正则表达式 ".*" 去匹配,则后果为 "a.com"></a><div class="one"。因为贪心模式,匹配到了最长的字符串。因而,应该应用 ".*?"去匹配,后果为 "a.com"。这时,正确匹配到a标签中蕴含的链接(尽管有两个引号的)。

March 4, 2021 · 1 min · jiezi

关于正则表达式:正则表达式基础工具书篇-字符

1. 为啥要写正则表达式在任何开发语言中都用的到,连写个linux命令都能用的到,用来指定检索、替换的规定模式。尽管它十分万能,然而有个很大的毛病,那就是 对老年选手太不敌对了。想用好正则表达式,就得记住一堆合乎(符号组合)及其作用。对鄙人来说,常常忘了查,查了忘。“查”的过程又常常比拟繁琐,索性写点合乎本人需要的内容,省的当前又是一顿xjb查。。。 2. 要写啥这里不再写对于js如何应用正则的内容了,写多了容易乱。这里,只说“正则表达式”这个货色。 3. 根底工具内容 字符相干1. 一般字母与数字写啥匹配啥,怼就完了。 2. 符号大多数的符号都在正则中表白非凡的含意,因而想匹配符号,个别要加个本义符 \。如 \. 、\?等。 3. 字符集用方括号 [ ] 包裹其余字符,用来匹配其中所蕴含的任意一个字符。 肯定记住匹配进去的是一个字符。外面所蕴含的字符,都是“或”的关系。比方 [abcde]匹配的是 a 或 b 或 c 或 d 或 e。 -用来示意范畴,比方 [0-9]匹配的是一个 0 到 9 之间的数字。^写在方括号里的最后面,用来示意不属于方括号内容的其余字符,比方 [^a-z]匹配到的是除了 小写a 到 小写z 这26个字母之外的其余任意一个字符。 4. 带字母的元字符本义符加一个字母,用来匹配特定范畴的一个字符。 一个字符。常见罕用的: 符号 含意 等价\d 数字 [0-9]\D 非数字 [^0-9]\w 数字字母下划线 [a-zA-Z0-9_]\W 非数字字母下划线 [^a-zA-Z0-9_]\s 空白字符 空格 制表符等 [ \f\n\r\t\v](留神前边有个空格)\S 非空白字符 [^ \f\n\r\t\v]\b 单词边界(不匹配理论字符)\B 非单词边界(不匹配理论字符)不罕用的不写了 老老实实去查吧。记忆技巧 符号的 小写字母 与 大写字母 对应的字符是互补的关系。记住一个,另一个就晓得是啥意思了。 ...

March 4, 2021 · 1 min · jiezi

关于正则表达式:JS中的第二世界正则表达式

近期的忙碌让我始终没有闲暇静下心来好好写一些文章。好在,所有的繁忙都已过来,愿今天更美妙。刚过完七夕,带着欢畅的情绪写下这篇文章。心愿读者可能喜爱哟~~ 你是不是常常遇到正则,却不知它在说什么,你是不是就算再我的项目中看到了,也会抉择一眼略过,你是不是终日遗记搜寻什么,却不晓得有的编辑器搜寻反对正则的含糊搜寻…… 相熟的旋律萦绕在耳边,却早已不是当初的少年。 工作了很久之后,猛然发现之前本人疏忽的正则是这么重要。搜寻、查问、命令行、校验、截取、替换…………哪样哪样都离不开这个小东西。很多人不晓得的是,正则在 JavaScript 里好像一个第二世界一样。看起来简略,实则有很多让咱们摸不着头脑的操作。 接下来,让咱们顺着本文的介绍,一点儿一点儿深刻理解正则表达式,通晓正则的弱小能力! 1. 创立正则表达式在 JavaScript 中创立正则表达式有两种形式 第一种:构造函数创立 const reg = new Reg('正则表达式')第二种:字面量创立 const reg = /正则表达式/2. 应用正则表达式匹配内容正则匹配分为 精准匹配 和 含糊匹配 精准匹配 只须要咱们将须要匹配的内容放入到正则表达式中匹配即可。上手简略 const reg = /正则表达式/const str = '这是一篇写正则表达式是文章'str.match(reg) // 正则表达式这里的正则表达式会精准的搜寻到咱们要搜寻的内容。 含糊匹配 含糊匹配须要用到第三点所形容的内容,这里咱们先看下 const reg = /[\u4e00-\u9fa5]+/const str = '这是一篇写正则表达式Regpx的内容'str.match(reg) // 这是一篇写正则表达式这里的正则表达式会依据咱们传入的规定来匹配要搜寻的内容。留神:这里的\u4e00-\u9fa5示意的是中文范畴 \u4e00 示意的是字符集中第一个中文汉字 \u9fa5 示意的是字符集中最初一个中文汉字 ok,晓得了怎么创立和应用正则,接下来咱们来真正理解一下他吧。 3. 正则表达式介绍精通元字符的同学可跳过此大节,直奔第四大节查看。次要内容有 . | \ * + ? () [] {} ^ $ 几种字符应用办法,含意和注意事项,内置匹配项,贪心和惰性匹配。 首先介绍一下前瞻条件,正则能够依据本人的设置来进行多行和全局,部分,疏忽大小写等匹配模式,分为: m :多行匹配g: 全局匹配i: 疏忽大小写接下来的内容,就能够看到咱们来应用它 ...

February 24, 2021 · 4 min · jiezi

关于正则表达式:关于GaussDBDWS的正则表达式知多少人人都能看得懂的详解来了

摘要:GaussDB(DWS)除了反对规范的POSIX正则表达式句法,还领有一些非凡句法和选项,这些你可理解?本文便为你解说这些非凡句法和选项。概述正则表达式(Regular Expression,简称RE),通常被用来检索、替换那些合乎某个模式(规定)的文本。正则表达式应用比拟灵便,功能强大,因而常常被用到进行文本的搜寻和替换中,帮忙开发人员疾速进行批量文本查问和解决。比方罕用的linux的grep命令,许多程序设计语言比方Perl、Tcl也都反对正则表达式进行字符串操作。 GaussDB(DWS)反对的正则表达式POSIX 1003.2中定义的正则表达式RE有两种模式:扩大RE或ERE(大抵为egrep的RE),和根本RE或BRE(大抵为ed的RE),GaussDB(DWS)都反对这两种模式,并实现了在编程语言(如Perl和Tcl)中宽泛应用而POSIX规范中未蕴含的一些扩大。应用这些非POSIX扩大的RE在本文中称为高级RE或ARE。ARE简直是ERE的超集,然而BRE有几种符号不相容性(而且是无限的)。 GaussDB(DWS)的正则表达式的次要句法和在其余程序语言中反对的句法性能雷同,此文不再赘述。本文中对GaussDB(DWS)领有的非凡模式和句法进行阐明。 GuassDB(DWS)反对的正则表达式函数GaussDB(DWS)提供了反对POSIX正则表达式的函数,如表1所示。 表1 GaussDB(DWS)中的正则表达式函数 从表1中看到,GuassDB(DWS)反对的正则表达式函数都有一个可选的flags参数,该参数的可选项及其含意是什么呢?上面将开展进行具体举例说明。 GaussDB(DWS)正则表达式函数的flags参数详解表2中列举了表1中flags参数的所有可选项。 表2 GaussDB(DWS)正则表达式函数的flags参数的选项阐明 g选项表2中给出的flags参数选项形容,十分简洁,了解起来比拟艰难。上面通过一些示例,来直观帮忙了解下面这些flags参数选项的含意。 示例1-1:未指定’g‘选项,仅对第一个匹配项进行替换 示例1-2:指定’g‘选项,对所有匹配项进行替换 c 和 i 选项示例2-1:默认状况下,进行大小写敏感匹配 示例2-2:显示指定进行大小写敏感匹配 示例2-3:显示指定进行大小写不敏感匹配 n[或m]、s、p、w选项对元字符点(.)的影响示例3-1:指定选项n时,元字符点(.)不匹配换行符 示例3-2:指定选项s时,元字符点(.)匹配换行符 示例3-3:指定选项p时,元字符点(.)不匹配换行符 示例3-4:指定选项w时,元字符点(.)匹配换行符 n[或m]、s、p、w选项对元字符^、$的影响示例5-1:指定选项n时,元字符点^、$匹配行首和行尾 示例5-2:指定选项s时,元字符点^、$不匹配行首和行尾 示例5-3:指定选项p时,元字符点^、$不匹配行首和行尾 示例5-4:指定选项w时,元字符点^、$匹配第一个行首匹配的行到最初一个行尾匹配的行 n[或m]、s、p、w选项对元字符 [^ 的影响示例6-1:指定选项n时,换行符不匹配被[^排除的字符,所有行尾的换行符未被替换为M 示例6-2:指定选项s时,换行符匹配被[^排除的字符,所有行尾的换行符被替换为M 示例6-3:指定选项p时,换行符不匹配被[^排除的字符,所有行尾的换行符被替换为M 示例6-4:指定选项w时,换行符匹配被[^排除的字符,所有行尾的换行符被替换为M t 和 x 选项通常状况下,RE语法都是严格的,即RE中的所有字符都是重要的。严格语法是默认的,也能够通过指定选项t示意。 示例7-1:在严格语法中,空白字符也是重要的 GaussDB(DWS)还有一个扩大语法,通过指定x选项示意。在扩大语法中,RE中的空白字符(在这里,空白是空格、程度制表符、新行、和任何属于 space 字符类的字符。)将被疏忽,以及#和换行符(或RE的结尾)之间的所有字符也将被疏忽。这种语法容许对简单的RE进行分段落和正文。 示例7-2:在扩大语法中,RE中的空格被疏忽 该规定有三个例外: · 转义字符后的空白或#被保留 示例7-3 ...

February 23, 2021 · 1 min · jiezi

关于正则表达式:正则学习

正则学习类字符类[ ]合乎某些特色的一个对象/[ABC]/ 示意匹配ABC 中的一个即可 反向类[^]在中括号中加^例:[ ^A ] 就是匹配不是A的字符 范畴类[A-Z]能够匹配A-Z内的任意一个字符 预约义类预约义字符:\d 示意数字 边界字符\b 示意边界^在[]外示意匹配结尾的意思$示意匹配结尾的意思 量词{n} 匹配字符串长度为n{m,n} 匹配字符串长度最小为m,最大为n{m,} 匹配字符串长度最小为m,最大为无穷{0,n} 匹配字符串长度最小为空,最大为n+ 呈现次数>=1* 现次数>=0? 呈现次数 0或者1. 能够匹配任意字符,除了空白字符中的换行符\n 贪心模式12345678.replace(/\d{3,6}/,‘x’) 输入X78非贪心模式只须要在量词前面增加一个问号 12345678.replace(/\d{3,6}?/,‘x’) 输入XX78 尝试起码可能的匹配分组应用()能够使量词最用与分组而非紧挨着它的单词‘a1b2c3d4’.replace(/([a-z]\d){3}/g),‘x')输入xd4 或a|b 反向援用$援用(捕捉) 2019-12-05 替换成12/05/2019 '2019-12-05'.replace('/(/d{4}-(\d{2})-(/d{2}))/g','$2/$3/$1') $是以分组捕捉 不想捕捉分组的时候只须要在分组内加上?:(?:gray).(ok) 这里$1是ok 前瞻和后顾待学习 本来含意的字符待学习 元字符(代表非凡含意的字符)待学习 XMind - Trial Version

February 22, 2021 · 1 min · jiezi

关于正则表达式:正则表达式匹配代码块的注释

应用正则外部的逻辑短路匹配之一举多得用多分支来排除,向if-else那样不必写出齐全的条件。小而广的条件有时不仅能匹配到最终目标,而且还能精益求精(一举多得): regexp = /str|regexp|lineannotaion|blockannotation|tampstring/g let tmp='', str = ` ${tmp+'\`'+"${}"+ `${tmp}`+ /*A*/ (tmp={'a':/(?<!x`)/g}["a"]) //B}'c' \" <d> & // e /*f*/`, // greg = /(?<!\\)\/(?![^\/\*])[\s\S]+?(?<!\\)\//g;//*/ h str; reg = /c/g, str = ``/*/ j k //KK//*/str = "\"http://'xxxx'\/\"";str = `.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ')${`l`+str}`str = '\ \' //n"`\' /* // */匹配任意字符 /[\s\S]/g/[^]/g匹配单行正文 /\/\/.*/g匹配多行正文 /\/\*[^]*?\*\//g匹配字符串 /('|"|`)[^]*?(?<!\\)\1/g/''|``|""|('|"|`)[^]*?[^\\]\1/g/''|""|('|")[^]*?[^\\]\1|`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/g字符串模板${}外部可能还会呈现字符串模板和正则表达式内存在未本义的\`书写简略的字符串模板时应用第二个正则表达式应该是没大问题的 匹配正则表达式 /\/.*?[^\\]\//g替换须要本义的字符 .replace(/&|<|\u00a0/g,m=> m =='&' ? "&amp;" : m=='<' ? "&lt" : /\u00a0/.test(m) ? ' ' : m)根本实现CODE_JAVASCRIPT.replace(/&|<|\u00a0/g,m=> // 匹配须要本义的HTML符号 m =='&' ? "&amp;" : m=='<' ? "&lt" : /\u00a0/.test(m) ? ' ' : m).replace( // /\/\/.*|\/\*[^]*?\*\/|''|``|""|('|"|`)[^]*?[^\\]\1|\/.*?[^\\]\//g, // ${}外部不能再嵌套模板字符串,外部应用正则时要本义`,像这样 ${"helo".match(/\`/)[0]} /\/\/.*|\/\*[^]*?\*\/|\/.*?[^\\]\/|''|""|('|")[^]*?[^\\]\1|`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/g, (m,a,b,c,d,e,f,g)=>{ // return /\/\*|\/\//.test(m.slice(0, 2)) return m.slice(0,2) == "//" || m.slice(0,2) == "/*" // ? (!b || /\r|\n/.test(c[b-1]) ? "<span class=\"annotation\">"+m+"</span>" : "<span class=\"annotation-sub\">"+m+"</span>") ? "<span class=\"annotation\">"+m+"</span>" : m})测试版 ...

February 9, 2021 · 2 min · jiezi

关于正则表达式:正则表达式速查

正则表达式速查正则表达式默认为“贪心”,最大匹配; 在量词后加?可改为“非贪心” 罕用代码匹配要求代码任意汉字[u4e00-u9fa5]Enter回车符rn\r \n \r\n 理论利用中的区别 存疑 量词量词位于字符前面,在搜寻时限度字符的数量 代码含意{m}m个{m,n}m到n个*0到任意个+1到任意个?0到1个字符代码助记含意例句....示意省略号任意字符(不包含换行符)[A-Z]-[ ... ]示意区间中的任意字符ddigit数字从0到9的数字s Ssymbol符号s任意空白字符,S任意非空字符w Wword单词w代表word,匹配字母、数字或下划线字符线,W是w的反集( ) 示意子表达式nnewline另一行换行符rreturn回车回车符^-字符开始,[ ]中的^示意逻辑非“¬”$-字符完结\ -逻辑或分组(abc)? 示意0个或1个abc 这里一 个括号的表达式就示意一个分组 。捕捉组1.分组的编号从左到右计算其开括号来编号例:表达式: (A)(B(C)) 编号分组0(A)(B(C))1(A)2(B(C))3(C)2.Back援用反向援用,援用的是后面捕捉组中的文本而不是正则,也就是说反向援用处匹配的文本应和后面捕捉组中的文本雷同例:字符串:帅哥123456帅锅---帅哥123456帅哥表达式①:;后果:表达式②:;后果: 3.分组列举非捕捉组以 (?) 结尾,不捕捉文本,不存在backref反相援用代码含意例句(?:Pattern)匹配Pattern字符字符串:indestry哈哈哈哈indestries 正则:indestr(y\ies)或者indestr(?:y\ies) 后果:indestry或者indestries(?<=X)X ,通过零宽度的正 lookbehind字符串:name:wangfei 正则:(?<=name:)(wangfei) 后果:wangfei(?=X)X ,通过零宽度的正 lookahead字符串:product_path 正则:(product)(?=_path) 后果:product(?<!X)X ,通过零宽度的负 lookbehind字符串:name:angelica 正则:(?<!nick_name:)(angelica) 后果:angelica; 字符串:name:angelica 正则:(?<!name:)(angelica) 后果:空(?!X)X ,通过零宽度的负 lookahead字符串:product_path 正则:(product)(?!_url) 后果:product;字符串:product_path 正则:(product)(?!_path) 后果:空

January 22, 2021 · 1 min · jiezi

关于正则表达式:前端正则练习题

练习题1.把get-element-by-id转为驼峰命名 var str = 'get-element-by-id' const reg = /-\w/g const newStr = str.replace(reg, word => { console.log(word, 'word12') return word.substring(1).toUpperCase() }) console.log(newStr, 'newStr') // getElementById2.判断电话号码 function isPhone(tel) { var regx = /^1[34578]\d{9}$/; return regx.test(tel); }3.查找反复单词var str = "Is is the cost of of gasoline going up up";var patt1 = /\b([a-z]+) \1\b/ig;document.write(str.match(patt1));\1 指定第一个子匹配项 back reference 反向参考~~~~4.abcdebbcde匹配叠词(考查反向援用)https://www.cnblogs.com/guorange/p/6693168.html源字符串:abcdebbcde正则表达式:([ab])1对于正则表达式“([ab])1”,捕捉组中的子表达式“[ab]”尽管能够匹配“a”或者“b”,然而捕捉组一旦匹配胜利,反向援用的内容也就确定了。如果捕捉组匹配到“a”,那么反向援用也就只能匹配“a”,同理,如果捕捉组匹配到的是“b”,那么反向援用也就只能匹配“b”。因为前面反向援用“1”的限制,要求必须是两个雷同的字符,在这里也就是“aa”或者“bb”能力匹配成功。~~~~5.给定字符串str,查看其是否合乎如下格局XXX-XXX-XXXX 其中X为Number类型 function matchesPattern(str) { return /^(\d{3}-){2}\d{4}$/.test(str);6、JS实现千位分隔符前端没有后顾,所以只解说前瞻 首先咱们要了解正则的解析程序 正则解析程序->从左向右,向左边看就是前瞻 ?= 正向前瞻 例如: /b(?=a)/.test('bab') 看前瞻的局部是否是a   //true?! 负向前瞻 /b(?!a)/.test('bb') 看前瞻局部是不是非a //true const number = 123456789123 var regx = /\d{1,3}(?=(\d{3})+$)/g // document.write((number + '').replace(regx, '$&,')) // $&示意与regx相匹配的字符串123 456 789 最初的123 // 没有被匹配上是因为?= 前瞻的时候没有3位数~~~~字 document.write( (number + '').replace(regx, function (world) { //这里的world就是下面的$& 即 123 456 789 return world + ',' }), ) ~~~~

January 22, 2021 · 1 min · jiezi

关于正则表达式:记录一下项目中遇到的正则表达式

要求:必须有一个字母和数字,如果有_则_后必须有数字.除_外不能够有特殊字符. 例子: aa / AA / Aa /Aa_ / A1_a / A_1 / A1_1A 都不能过a1 / a1_1 / A1 / A1_11 能够过 最终正则表达式: ^([A-Za-z]+[0-9]+)(_[0-9]+)?$合成了解 :^...$ : 开始和结尾,固定写法第一局部 : ([A-Za-z]+[0-9]+) 大写字母或者小写字母 +代表至多一个以上.起码一个.数字0-9, +代表至多一个数字,上不限第二局部 : (_[0-9]+)? 以 _开始,数字结尾.数字一个以上,上不限. ?的意思是可有可无. 有_就必须有数字. 是用小括号包起来的.一个整体.

December 30, 2020 · 1 min · jiezi

关于正则表达式:常用正则表达式库

1.火车车次 /^[GCDZTSPKXLY1-9]\d{1,4}$/2.带端口号的网址 /^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?$/(1)ip-v4[:端口] /^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]).){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/(2)ip-v6[:端口] ~~~~/^(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))|\[(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))\](?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/i (3)mac地址 /^((([a-f0-9]{2}:){5})|(([a-f0-9]{2}-){5}))[a-f0-9]{2}$/i3.子网掩码 /^(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/4.网址(url,反对端口和"?+参数"和"#+参数) /^(((ht|f)tps?):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?$/5.对立社会信用代码/^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/6.对立社会信用代码宽松匹配(15位/18位/20位数字/字母) /^(([0-9A-Za-z]{15})|([0-9A-Za-z]{18})|([0-9A-Za-z]{20}))$/7.银行卡号(10到30位, 笼罩对公/私账户 /^[1-9]\d{9,29}$/8.手机号(mobile phone)中国(谨严), 依据工信部2019年最新颁布的手机号段 /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-7|9])|(?:5[0-3|5-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1|8|9]))\d{8}$/9.手机号(mobile phone)中国(宽松), 只有是13,14,15,16,17,18,19结尾即可 /^(?:(?:\+|00)86)?1[3-9]\d{9}$/10.手机号(mobile phone)中国(最宽松), 只有是1结尾即可, 如果你的手机号是用来接管短信, 优先倡议抉择这一条 /^(?:(?:\+|00)86)?1\d{10}$/11.date(日期) /^\d{4}(-)(1[0-2]|0?\d)\1([0-2]\d|\d|30|31)$/12.Email邮箱 /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/13.身份证号(2代,18位数字),最初一位是校验位,可能为数字或字符X /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/14.帐号是否非法(字母结尾,容许5-16字节,容许字母数字下划线组合 /^[a-zA-Z]\w{4,15}$/15.QQ号格局正确 /^[1-9][0-9]{4,10}$/16.明码强度校验,起码6位,包含至多1个大写字母,1个小写字母,1个数字,1个特殊字符 /^\S*(?=\S{6,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$/记录下来,不便本人,不便别人

December 30, 2020 · 1 min · jiezi

关于正则表达式:正则表达式

根底定义:`\d`:匹配数字`\w`:匹配数字或字母`.`:匹配任意字符`\s`:匹配空格`*`:任意个字符`+`:多个`?`:0/1个`{n}`:n个`{n,m}`:n-m个`[]`:标适范畴`A|B`:能够匹配A或B`^`示意行的结尾`$`示意行的完结特殊字符须要用`'\'`转译.例:'-'=>`\-`例子:1. 例:![](https://www.runoob.com/wp-content/uploads/2014/03/CEBB49BB-B1AD-4539-AC7A-B40DDC62D1B2.jpg) * ^ 为匹配输出字符串的开始地位。 * [0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。 * abc$匹配字母 abc 并以 abc 结尾,$为匹配输出字符串的完结地位。2. 例:咱们在写用户注册表单时,只容许用户名蕴含字符、数字、下划线和连贯字符(-),并设置用户名的长度,咱们就能够应用以下正则表达式来设定。![](https://www.runoob.com/wp-content/uploads/2018/09/regexp-cn.png)在JavaScript中应用正则:RegExp:是正则表达式(regular expression)的简写。语法: var patt = new RegExp(pattern,modifiers)或者var patt = /pattern/modifiers例:var re = new RegExp("w+"); 等价于var re = /w+/;i - 修饰符是用来执行不辨别大小写的匹配。g - 修饰符是用于执行全文的搜寻(而不是在找到第一个就进行查找,而是找到所有的匹配)。 test():查问指定字符返回true/false例:re.test('sting')exec():查问指定字符返回被找到的值/null例:re.exec('sting')在python当中应用正则re模块转译:s = 'ABC\\001'等价于s = r'ABC\001'=>'ABC-001'match()办法判断是否匹配,返回一个Match对象/Noneimport rere.match(r'^d{3}-d{3,8}$', '010-12345')//<_sre.SRE_Match object; span=(0, 9), match='010-12345'>re.match(r'^d{3}-d{3,8}$', '010 12345')//none切割字符串 'a b c'.split(' ')// ['a', 'b', '', '', 'c']// 无奈解决空格re.split(r'[s,;]+', 'a,b;; c d')// ['a', 'b', 'c', 'd']// 主动解决分组用()示意的就是要提取的分组(Group) ...

December 22, 2020 · 1 min · jiezi

关于正则表达式:手把手教你写正则表达式

1.什么是正则表达式正则表达式是一种被用于从文本中检索合乎某些特定模式的文本。 正则表达式是从左到右来匹配一个字符串的。英文Regular Expression,咱们通常应用它的缩写 "regex" 或者 "regexp"。 正则表达式能够被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。 2.为什么要学习正则表达式正则表达式在咱们开发过程中很罕用,然而很多人并不会写正则表达式,每到要用正则表达式的时候怎么办呢?万能解决办法百度。真是一个好方法。万一百度没有本人想要的答案怎么办呢?那只能本人边学边写。这篇文章将能够帮忙你边学边写正则表达式----文尾附罕用正则表达式。 3.元字符元字符是正则表达式的根本组成元素。元字符在这里跟它通常表白的意思不一样,而是以某种非凡的含意去解释。有些元字符写在方括号内的时候有非凡含意。 元字符如下: 元字符形容.匹配除换行符以外的任意字符[]字符类,匹配方括号中蕴含的任意字符。[^]否定字符类。匹配方括号中不蕴含的任意字符。*匹配后面的子表达式零次或屡次+匹配后面子表达式一次或屡次?匹配后面的子表达式零次或一次。{n,m}花括号,匹配后面字符至多n次,然而不超过m次(x,y,z)依照确切的程序匹配字符xyz\ 分支构造,匹配分支构造其中一个字符\本义符,它能够还原元字符原来的含意,容许你匹配保留字符 `[ ] ( ) { } . * + ? ^ $ \^匹配行的开始$匹配行的完结3.0.举例和测试方法例如正则表达式[H|g]ello能够匹配字符串Hello或hello。那么咱们写完正则表达式后该怎么测试呢? 咱们能够应用在线的正则表达式测试平台进行测试;例如菜鸟在线测试 咱们也能够应用对应的编程语言进行测试。 JavaScript // 须要匹配的字符var str = 'Hello'// replace 里参数是正则表达式var s = str.replace('[H|h]ello');console.log(s)Java public static void main(String[] args) { // 要验证的字符串 String str = "hello"; // 验证规定 String regEx = "[H|h]ello"; // 编译正则表达式 Pattern pattern = Pattern.compile(regEx); // 疏忽大小写的写法 // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(str); // 字符串是否与正则表达式相匹配 boolean rs = matcher.matches(); System.out.println(rs); }Golang ...

December 16, 2020 · 1 min · jiezi

关于正则表达式:夏哥事件簿-正则表达式

//非零的正整数 var num1 = /^+?[1-9][0-9]*$/;//正整数 + 0 var num2 = /^d+$/;//负数 var num3 = /^d+(?=.{0,1}d+$|$)/; //金额格局 var moneyReg = /(^[1-9]([0-9]+)?(.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9].[0-9]([0-9])?$)/; 继续更新ing

December 3, 2020 · 1 min · jiezi

关于正则表达式:ES9ES2018中的正则表达式

ES9中正则表达式相干次要有两个提案:正则表达式命名捕捉组 & 正则表达式dotAll模式,目前都已进入stage4阶段。 正则表达式命名捕捉组ECMAScript提案“正则表达式命名捕捉组”proposal-regexp-named-group 由 Gorkem Yakin, Daniel Ehrenberg负责。 1. 什么是捕捉组捕捉组就是把正则表达式中子表达式匹配的内容,保留到内存中以数字编号或显示命名的组里,不便前面援用,且这种援用既能够在正则表达式外部,也能够在正则表达式内部。 捕捉组有两种模式,一种是一般捕捉组,另一种是命名捕捉组。 目前JavaScript只反对数字模式的一般捕捉组,而这个提案就是为了给JavaScript减少命名捕捉组。 2.捕捉组编号规定编号规定指的是以数字为捕捉组进行编号的规定, 编号0的捕捉组代表正则表达式整体。 const regex = /(\d{4})-(\d{2})-(\d{2})/;const matchers = regex.exec('2020-12-02');console.table(matchers) 3.命名捕捉组应用数字捕捉组的一个毛病是对于援用不太直观。比方下面的例子,咱们绝对比拟难分分明哪个组代表年,哪个组代表月或者日。而且,当咱们交互了年和月的值时,应用捕捉组援用的代码都须要更改。 而命名捕捉组就是为了解决这个问题。 命名捕捉组能够应用(?<name>...)语法给每个组起个名称。因而,用来匹配日期的正则表达式能够写为: /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/每个捕捉组的名字必须惟一,否则会抛出异样:另外,捕捉组的名字必须合乎JavaScript命名标准: 命名捕捉组能够通过匹配后果的groups 属性拜访。 let regx = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;let result = regx.exec('2020-12-02');result.groups.year === '2020';result.groups.month === '12';result.groups.day === '02';result[0] === '2020-12-02';result[1] === '2020';result[2] === '12';result[3] === '02';应用解构赋值的例子: let regx = /^(?<one>.*):(?<two>.*)$/;let {groups: {one, two}} = regx.exec('foo:bar');console.log(`one: ${one}, two: ${two}`);4.反向援用当须要在正则表达式外面援用命名捕捉组时,应用\k<name>语法。 let duplicate = /^(?<half>.*).\k<half>$/;duplicate.test('a*b'); // falseduplicate.test('a*a'); // true如果援用一个不存在的命名捕捉组,会抛出异样:命名捕捉组也能够和一般数字捕捉组一起应用: ...

December 2, 2020 · 1 min · jiezi

关于正则表达式:密码的正则表达式必须包含至少八个字符至少一个数字以及大小写字母和特殊字符

正则在线测试地址至多八个字符,至多一个字母和一个数字: "^(?=.*[A-Za-z])(?=.*d)[A-Za-zd]{8,}$" 至多八个字符,至多一个字母,一个数字和一个特殊字符: "^(?=.*[A-Za-z])(?=.*d)(?=.*[@$!%*#?&])[A-Za-zd@$!%*#?&]{8,}$" 至多八个字符,至多一个大写字母,一个小写字母和一个数字: "^(?=.*[a-z])(?=.*[A-Z])(?=.*d)[a-zA-Zd]{8,}$" 至多八个字符,至多一个大写字母,一个小写字母,一个数字和一个特殊字符: "^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[@$!%*?&])[A-Za-zd@$!%*?&]{8,}$" 起码8个字符,最多10个字符,至多一个大写字母,一个小写字母,一个数字和一个特殊字符: "^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[@$!%*?&])[A-Za-zd@$!%*?&]{8,10}$"

December 2, 2020 · 1 min · jiezi

关于正则表达式:我在乐字节学习前端的第五天正则表达式详细笔记及总结

1. 正则表达式规定1.1 一般字符字母、数字、汉字、下划线、以及后边章节中没有非凡定义的标点符号,都是"一般字符"。表达式中的一般字符,在匹配一个字符串的时候,匹配与之雷同的一个字符。 举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配后果是:胜利;匹配到的内容是:"c";匹配到的地位是:开始于2,完结于3。(注:下标从0开始还是从1开始,因以后编程语言的不同而可能不同) 举例2:表达式 "bcd",在匹配字符串 "abcde" 时匹配后果是:胜利;匹配到的内容是:"bcd";匹配到的地位是:开始于1,完结于4。 1.2 简略的转义字符一些不便书写的字符,采纳在后面加 "/" 的办法。这些字符其实咱们都曾经熟知了。 表达式 可匹配 /r, /n 代表回车和换行符 /t 制表符 // 代表 "/" 自身 还有其余一些在后边章节中有非凡用途的标点符号,在后面加 "/" 后,就代表该符号自身。比方:^, $ 都有非凡意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就须要写成 "/^" 和 "/$"。 表达式 可匹配 /^ 匹配 ^ 符号自身 /$ 匹配 $ 符号自身 /. 匹配小数点(.)自身 这些转义字符的匹配办法与 "一般字符" 是相似的。也是匹配与之雷同的一个字符。 举例1:表达式 "/$d",在匹配字符串 "abc$de" 时,匹配后果是:胜利;匹配到的内容是:"$d";匹配到的地位是:开始于3,完结于5。 1.3 可能与 '多种字符' 匹配的表达式正则表达式中的一些示意办法,能够匹配 '多种字符' 其中的任意一个字符。比方,表达式 "/d" 能够匹配任意一个数字。尽管能够匹配其中任意字符,然而只能是一个,不是多个。这就好比玩扑克牌时候,大小王能够代替任意一张牌,然而只能代替一张牌。 表达式 ...

November 18, 2020 · 7 min · jiezi

关于正则表达式:查找代码中所有中文字符的正则表达式

所有中文^((?!(\*|//)).)+[\u4e00-\u9fa5] 排除正文(".[\u4E00-\u9FA5]+)|([\u4E00-\u9FA5]+.")

November 6, 2020 · 1 min · jiezi

关于正则表达式:好文推荐简单易懂的正则表达式

链接:https://www.sitepoint.com/learn-regex/

October 10, 2020 · 1 min · jiezi

关于正则表达式:最实用的正则表达式整理

作者:慕课网链接:https://zhuanlan.zhihu.com/p/...起源:知乎著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。 一、校验数字的表达式1 数字: ^[0-9]$ 2 n位的数字: ^d{n}$ 3 至多n位的数字: ^d{n,}$ 4 m-n位的数字:^d{m,n}$ 5 零和非零结尾的数字:^(0|[1-9][0-9]*)$ 6 非零结尾的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的负数或正数:^(-)?d+(.d{1,2})?$ 8 负数、正数、和小数:^(-|+)?d+(.d+)?$ 9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$11 非零的正整数:^[1-9]d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^+?[1-9][0-9]*$12 非零的负整数:^-[1-9][]0-9"*$ 或 ^-[1-9]d*$13 非负整数:^d+$ 或 ^[1-9]d*|0$14 非正整数:^-[1-9]d*|0$ 或 ^((-d+)|(0+))$15 非负浮点数:^d+(.d+)?$ 或 ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$16 非正浮点数:^((-d+(.d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$17 正浮点数:^[1-9]d*.d*|0.d*[1-9]d*$ 或 ^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$18 负浮点数:^-([1-9]d*.d*|0.d*[1-9]d*)$ 或 ^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$19 浮点数:^(-?d+)(.d+)?$ 或 ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$二、校验字符的表达式1 汉字:^[u4e00-u9fa5]{0,}$ 2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 3 长度为3-20的所有字符:^.{3,20}$ 4 由26个英文字母组成的字符串:^[A-Za-z]+$ 5 由26个大写英文字母组成的字符串:^[A-Z]+$ 6 由26个小写英文字母组成的字符串:^[a-z]+$ 7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 8 由数字、26个英文字母或者下划线组成的字符串:^w+$ 或 ^w{3,20}$ 9 中文、英文、数字包含下划线:^[u4E00-u9FA5A-Za-z0-9_]+$10 中文、英文、数字但不包含下划线等符号:^[u4E00-u9FA5A-Za-z0-9]+$ 或 ^[u4E00-u9FA5A-Za-z0-9]{2,20}$11 能够输出含有^%&',;=?$"等字符:[^%&',;=?$x22]+12 禁止输出含有~的字符:[^~x22]+三、非凡需要表达式1 Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$ 2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? 3 InternetURL:[a-zA-z]+://[^s]* 或 ^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$ 4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])d{8}$ 5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((d{3,4}-)|d{3.4}-)?d{7,8}$ 6 国内电话号码(0511-4405222、021-87888822):d{3}-d{8}|d{4}-d{7} 7 身份证号(15位、18位数字):^d{15}|d{18}$ 8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ 9 帐号是否非法(字母结尾,容许5-16字节,容许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$10 明码(以字母结尾,长度在6~18之间,只能蕴含字母、数字和下划线):^[a-zA-Z]w{5,17}$11 强明码(必须蕴含大小写字母和数字的组合,不能应用特殊字符,长度在8-10之间):^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 12 日期格局:^d{4}-d{1,2}-d{1,2}13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$16 1.有四种钱的示意模式咱们能够承受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$17 2.这示意任意一个不以0结尾的数字,然而,这也意味着一个字符"0"不通过,所以咱们采纳上面的模式:^(0|[1-9][0-9]*)$18 3.一个0或者一个不以0结尾的数字.咱们还能够容许结尾有一个负号:^(0|-?[1-9][0-9]*)$19 4.这示意一个0或者一个可能为负的结尾不为0的数字.让用户以0结尾好了.把负号的也去掉,因为钱总不能是负的吧.上面咱们要加的是阐明可能的小数局部:^[0-9]+(.[0-9]+)?$20 5.必须阐明的是,小数点前面至多应该有1位数,所以"10."是不通过的,然而 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$21 6.这样咱们规定小数点前面必须有两位,如果你认为太刻薄了,能够这样:^[0-9]+(.[0-9]{1,2})?$22 7.这样就容许用户只写一位小数.上面咱们该思考数字中的逗号了,咱们能够这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$23 8.1到3个数字,前面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$24 备注:这就是最终后果了,别忘了"+"能够用"*"代替如果你感觉空字符串也能够承受的话(奇怪,为什么?)最初,别忘了在用函数时去掉去掉那个反斜杠,个别的谬误都在这里25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+.[x|X][m|M][l|L]$26 中文字符的正则表达式:[u4e00-u9fa5]27 双字节字符:[^x00-xff] (包含汉字在内,能够用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))28 空白行的正则表达式:ns*r (能够用来删除空白行)29 HTML标记的正则表达式:<(S*?)[^>]*>.*?</1>|<.*? /> (网上流传的版本太蹩脚,下面这个也仅仅能局部,对于简单的嵌套标记仍旧无能为力)30 首尾空白字符的正则表达式:^s*|s*$或(^s*)|(s*$) (能够用来删除行首行尾的空白字符(包含空格、制表符、换页符等等),十分有用的表达式)31 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)32 中国邮政编码:[1-9]d{5}(?!d) (中国邮政编码为6位数字)33 IP地址:d+.d+.d+.d+ (提取IP地址时有用)34 IP地址:((?:(?:25[0-5]|2[0-4]d|[01]?d?d).){3}(?:25[0-5]|2[0-4]d|[01]?d?d)) "^d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?d+$" //整数 "^d+(.d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数"^((-d+(.d+)?)|(0+(.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数 "^(-?d+)(.d+)?$" //浮点数 "^[A-Za-z]+$" //由26个英文字母组成的字符串 "^[A-Z]+$" //由26个英文字母的大写组成的字符串 "^[a-z]+$" //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串 "^w+$" //由数字、26个英文字母或者下划线组成的字符串 "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$" //email地址 "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$" //url整数或者小数:^[0-9]+.{0,1}[0-9]{0,2}$ 只能输出数字:"^[0-9]*$"。 只能输出n位的数字:"^d{n}$"。 只能输出至多n位的数字:"^d{n,}$"。 只能输出m~n位的数字:。"^d{m,n}$" 只能输出零和非零结尾的数字:"^(0|[1-9][0-9]*)$"。 只能输出有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。 只能输出有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。 只能输出非零的正整数:"^+?[1-9][0-9]*$"。 只能输出非零的负整数:"^-[1-9][]0-9"*$。 只能输出长度为3的字符:"^.{3}$"。 只能输出由26个英文字母组成的字符串:"^[A-Za-z]+$"。 只能输出由26个大写英文字母组成的字符串:"^[A-Z]+$"。 只能输出由26个小写英文字母组成的字符串:"^[a-z]+$"。 只能输出由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。 只能输出由数字、26个英文字母或者下划线组成的字符串:"^w+$"。 验证用户明码:"^[a-zA-Z]w{5,17}$"正确格局为:以字母结尾,长度在6~18之间,只能蕴含字符、数字和下划线。 验证是否含有^%&'',;=?$"等字符:"[^%&'',;=?$x22]+"。 只能输出汉字:"^[u4e00-u9fa5]{0,}$" 验证Email地址:"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$"。 验证InternetURL:"^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$"。 验证电话号码:"^((d{3,4}-)|d{3.4}-)?d{7,8}$"正确格局为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。 验证身份证号(15位或18位数字):"^d{15}|d{18}$"。 验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格局为:"01"~"09"和"1"~"12"。 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格局为;"01"~"09"和"1"~"31"。整数或者小数:^[0-9]+.{0,1}[0-9]{0,2}$ "^w+$" //由数字、26个英文字母或者下划线组成的字符串 "^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$" //email地址 "^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$" //url可输出形如2008、2008-9、2008-09、2008-9-9、2008-09-09. ^(d{4}|(d{4}-d{1,2})|(d{4}-d{1,2}-d{1,2}))$ 邮箱验证正则表达式 w+([-+.']w+)*@w+([-.]w+)*.w+([-.]w+)* 四、网络验证利用技巧验证 E-mail格局public bool IsEmail(string str_Email) { return System.Text.RegularExpressions.Regex.IsMatch(str_Email,@"^([w-.]+)@(([−9]1,3.[−9]1,3.[−9]1,3.)|(([w−]+.)+))([a−zA−Z]2,4|[−9]1,3)(?)$"); } ...

September 17, 2020 · 3 min · jiezi

关于正则表达式:正则表达式口诀及教程

转载于:https://blog.csdn.net/weng_xianhu/article/details/10096863正则其实也势利,削尖头来把钱揣; (指开始符号^和结尾符号$) 特殊符号认不了,弄个倒杠来引路; (指\. \*等特殊符号) 倒杠前面跟小w, 数字字母来示意; (\w跟数字字母;\d跟数字) 倒杠前面跟小d, 只有数字来示意; 倒杠前面跟小a, 报警符号嘀一声; 倒杠前面跟小b, 单词分界或退格; 倒杠前面跟小t, 制表符号很明了; 倒杠前面跟小r, 回车符号晓得了; 倒杠前面跟小s, 空格符号很重要; 小写跟罢跟大写,多得切实不得了; 倒杠前面跟大W, 字母数字靠边站; 倒杠前面跟大S, 空白也就靠边站; 倒杠前面跟大D, 数字从此靠边站; 倒框前面跟大B, 不含结尾和结尾; 单个字符要反复,三个符号来帮忙; (* + ?) 0 星加1 到无穷,问号只管0 和1; (*表0-n;+表1-n;?表0-1次反复) 花括号里学识多,反复操作能力强; ({n} {n,} {n,m}) 若要反复字符串,园括把它括起来; ((abc){3} 示意字符串“abc”反复3次 ) 非凡汇合自定义,中括号来帮你忙; 本义符号行不通,一个一个来排队; 切实多得排不下,横杠请来帮个忙; ([1-5]) 尖头放进中括号,反义定义威力大; ([^a]指除“a”外的任意字符 ) 1竖作用可不小,两边正则互替换; (键盘上与“\”是同一个键) 1竖能用很屡次,简单定义很不便; 园括号,用处多; 反向援用指定组,数字排符对应它; (“\b(\w+)\b\s+\1\b”中的数字“1”援用后面的“(\w+)”) 反对组名自定义,问号加上尖括号; (“(?<Word>\w+)”中把“\w+”定义为组,组名为“Word”) 园括号,用处多,地位指定全靠它; 问号等号字符串,定位字符串后面; (“\b\w+(?=ing\b)”定位“ing”后面的字符串) 若要定位串前面,两头插个小于号; (“(?<=\bsub)\w+\b”定位“sub”前面的字符串) 问号加个惊叹号,前面跟串字符串; PHPer都晓得, !是取反的意思; 前面不跟这一串,通通合乎来报到; (“\w*d(?!og)\w*”,“dog”不合乎,“do”合乎) 问号小于惊叹号,前面跟串字符串; 后面不放这一串,通通合乎来报到; 点号星号很贪心,加个问号不贪心; 加号问号有保底,至多反复一次多; 两个问号老规矩,0次1次团团转; 花括号后跟个?,贪心变成不贪心; 还有很多装不下,等着当前来减少 ...

August 14, 2020 · 1 min · jiezi

玩转正则表达式推荐一个速查调试验证可视化工具

作为一个程序员、当代码农,时不时你会需要去写点正则表达式。但是,正则它毕竟不是一门语言,不是所有的程序员都会,或者说非常精通,有时候,你会遇到非常奇葩的正则表达式,可能你又写不出来,老大还急着要!项目还离不了你的这个正则表达式。 这时候,你肯定会抓耳挠腮,心想,要是有一个可以通过条件生成正则表达的工具,那该是有多好啊!在程序员的世界,哪里有需求,哪里就有开发,这不,还真就有这么一个吊炸天的工具:iHateRegex 。 github地址:https://github.com/geongeorge...i Hate Regex是一个在线开源工具,可快速检索并匹配到合适的正则表达式,帮你完成如用户名、邮箱、日期、手机号码、密码等常见规则的验证。 它有以下几个特点: 可视化正则表达式匹配的字符串-测试区域在您的网站上嵌入正则表达式可视化正则表达式代码突出显示和验证支持降价的正则表达式说明在Playground页面上,您可以创建自己的表达式并链接到它。用户登录并保存正则表达式访问及使用方式 它有两种访问及使用方式:1、在线,2、本地安装 1、在线访问直接访问https://ihateregex.io/ 2、本地安装 #安装 yarn (已安装的可以忽略)npm install -g yarn#克隆仓库git clone https://github.com/geongeorge/i-hate-regex.git#安装依赖yarn install#在本地测试yarn dev#打包并运行nuxt服务器yarn buildyarn start这个项目是用Nuxt.js打包。更详细的信息可以参考Nuxt.js文档民工哥建议还是使用在线的方式比较方便、实用,毕竟源码安装还涉及到很多框架的使用,没必要去花这种的学习成本。 使用截图 在首页点击下方的playground,进入页面: 这里,我们就可以看到,对应的正则表示式和匹配过程示意图。 在这里我们还可以修改正则表达式,对应的示意图也随之改变 另外再页面左侧导航栏上方可以搜索想要的正则表达式 这里我们输入IP,点击第一个(ip address(ipv4)) 非常的方便,实用,对于日常的工作使用肯定是已经足够了。 有兴趣的读者可以自己去尝试、探索一番,同时,如果你感觉这个小工具挺好、挺实用,请点个在看与转发分享出去,让更多的人去使用它,来提高工作效率。 也欢迎读者朋友们留言分享你所使用过的、实用的小工具。 更多精彩技术干货文章,也可以关注民工哥的微信公众号。

July 8, 2020 · 1 min · jiezi

正则表达式在JavaScript使用

正则介绍参考原文地址https://dev.to/chrisachard/in... 正则表达式是自定义一个规则,用于匹配字符串中符合规则的内容 在Javascript中定义正则表达式有两种方式: 定义于两个下划线之间 /[正则表达式]/通过 new RegExp() 方式结合三个方法来实现不同的功能: match 将匹配到的内容返回到一个数组中test 判断是否符合规则replace 匹配成功后替换内容正则实例废话少说,咱们来看代码吧 1、首先定义两个正则表达式 //匹配'r'const regOne = /r/i;//匹配'ed'const regTwo = new RegExp('ed', 'i');说明:new RegExp中第一个参数其实对应的就是两个下划线之间的规则,第二个参数对应的是下划线后面的规则(后面介绍) 2、来看看三个方法的使用 let find = 'red';console.log(find.match(regOne)); //['r']console.log(find.match(regTwo)); //['ed']console.log(regOne.test(find)); //trueconsole.log(find.replace(regOne , 'R')); //Red正则定义方法中括号的使用中括号的作用是定义一个匹配的范围,使用-将范围的起始值和结束值连接起来,例如: [a-z] 只匹配小写字母,即a到z之间的字符[A-Z] 只匹配大写字母,即A到Z之间的字符[1-9] 只匹配1到9之间的数字/[1-9]/new RegExp('[a-z]', 'i');匹配模式匹配模式定义查找的方式,有三种正则的匹配模式: i 不区分英文字母的大小写m 匹配多行文本g 全局匹配,默认情况下匹配到第一个符合规则的内容就不会往下继续查找,设置了全局模式之后,就会查找所有符合规则的内容1、单个模式实例 let find = 'Rred';const regOne = /r/i; //匹配'r'console.log(find.match(regOne)); //['R']匹配到R之后返回结果并停止查找,隐藏只返回了一个R 2、两种模式同时使用 let find = 'Rred';const regOne = /r/ig; //匹配'r'console.log(find.match(regOne)); //['R','r']本示例查找字符串中所有的大小写英文字母r 首尾匹配首尾匹配即首字符和最后一个字符的匹配 使用^匹配首字符使用$匹配最后一个字符1、简单实例 let find = 'Rred';console.log(/^r/.test(find)); //匹配首字母'r',falseconsole.log(/^R/.test(find)); //匹配首字母'R',trueconsole.log(/r$/.test(find)); //匹配最后一个字母'r',falseconsole.log(/d$/.test(find)); //匹配最后一个字母'd',true2、匹配多个字符 ...

October 15, 2019 · 1 min · jiezi

正则备忘录walker

下面的例子默认以 python 为实现语言,用到 python 的 re 模块或 regex 库。据 walke r猜测:在python3 的 Unicode 字符集下,re模块的 s 匹配 fnrtv 加全角半角空格,共 7 个字符。 正则表达式的文档正则表达式30分钟入门教程另一个不错的入门教程揭开正则表达式的神秘面纱,walker 觉得这篇文章对 Multiline 的讲解特别到位,截图如下: 提取双引号及之间的内容用 re.findalltext = '''abc"def"ghi'''re.findall(r'"[^"]+"', text)# 结果['"def"']用re.search。>>> text = '''abc"def"ghi'''>>> re.search(r'"([^"]+)"', text).group(0)'"def"'提取双引号之间的内容用 re.findall。text = '''abc"def"ghi'''re.findall(r'"([^"]+)"', text)# 结果['def']用 re.search。>>> text = '''abc"def"ghi'''>>> re.search(r'"([^"]+)"', text).group(1)'def'环视: (?<=pattern)、(?=pattern)text = '''abc"def"ghi'''re.findall(r'(?<=")[^"]+(?=")', text)# 结果['def']查找以某些字符串打头的行# 比如查找以+++、---、index打头的行#方法一,按行匹配for i in lst: if re.match(r"(---|\+\+\+|index).*", i): print i#方法二,一次性匹配re.findall(r'^(?:\+\+\+|---|index).*$', content, re.M)#方法二精简版re.findall(r'^(?:[-\+]{3}|index).*$', content, re.M)包含/不包含(参考:利用正则表达式排除特定字符串) 文本内容>>> print(text)www.sina.com.cnwww.educ.orgwww.hao.ccwww.baidu.comwww.123.comsina.com.cneduc.orghao.ccbaidu.com123.com匹配以www打头的行>>> re.findall(r'^www.*$', text, re.M)['www.sina.com.cn', 'www.educ.org', 'www.hao.cc', 'www.baidu.com', 'www.123.com']匹配不以www打头的行>>> re.findall(r'^(?!www).*$', text, re.M)['', 'sina.com.cn', 'educ.org', 'hao.cc', 'baidu.com', '123.com']匹配以cn结尾的行>>> re.findall(r'^.*?cn$', text, re.M)['www.sina.com.cn', 'sina.com.cn']匹配不以com结尾的行>>> re.findall(r'^.*?(?<!com)$', text, re.M)['www.sina.com.cn', 'www.educ.org', 'www.hao.cc', '', 'sina.com.cn', 'educ.org', 'hao.cc']匹配包含com的行>>> re.findall(r'^.*?com.*?$', text, re.M)['www.sina.com.cn', 'www.baidu.com', 'www.123.com', 'sina.com.cn', 'baidu.com', '123.com']匹配不包含com的行>>> re.findall(r'^(?!.*com).*$', text, re.M)['www.educ.org', 'www.hao.cc', '', 'educ.org', 'hao.cc']>>> re.findall(r'^(?:(?!com).)*?$', text, re.M)['www.educ.org', 'www.hao.cc', '', 'educ.org', 'hao.cc']匹配全部,去除部分利用分组得到网址的第一级,即去除后面几级。 ...

August 21, 2019 · 2 min · jiezi

正则表达式查询

速查表元字符描述\转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ \n匹配一个换行符,\\匹配\而\(则匹配(|或运算符,匹配符号前或后的字符串^从字符串开始位置匹配$从字符串结束位置匹配.匹配除换行符外的任意单个字符*匹配前面的子表达式零次或多次,等价于{0,}+匹配前面的子表达式一次或多次,等价于{1,}?匹配前面的子表达式零次或一次,等价于{0,1}{ }匹配前面的子表达式重复的次数。{n,m} 匹配前面的字表达最少n次且最多m次{n,} 匹配前面的字表达最少n次{n} 匹配前面的字表达n次[ ]字符集合[xyz] 匹配所包含的任意一个字符[a-z] 匹配指定范围内的任意一个字符[^]负字符集合[^xyz] 匹配未包含的任意字符[^a-z] 匹配任何不在指定范围的任意字符( )特征标群,写在( )中的子模式(parttern) 匹配pattern并获取这一匹配。简写字符集简写描述.除换行符外的所有字符\w匹配所有字母数字, 等同于 [a-zA-Z0-9_]\W匹配所有非字母数字, 即符号, 等同于: [^\w]\d匹配数字: [0-9]\D匹配非数字: [^\d]\s匹配所有空格字符, 等同于: [\t\n\f\r\p{Z}]\S匹配所有非空格字符: [^\s]\f匹配一个换页符\n匹配一个换行符\r匹配一个回车符\t匹配一个制表符\v匹配一个垂直制表符\p匹配 CR/LF (等同于 \r\n),用来匹配 DOS 行终止符常用匹配 用户名^[a-z0-9_-]{3,16}$密码^[a-z0-9_-]{6,18}$十六进制值^#?([a-f0-9]{6}$电子邮箱^#?([a-f0-9]{6}|[a-f0-9]{3})^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$URL^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$IP地址((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$HTML标签^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$删除代码\注释(?<!http:|\S)//.*$Unicode编码中的汉字范围^[\u2E80-\u9FFF]+$在线练习https://regex101.com/ 参考网址github项目:learn-regex正则表达式速查表

August 21, 2019 · 1 min · jiezi

微信小程序使用车牌号输入法

在做小程序时,做了一个关于车的项目,然后需要添加车辆信息、添加车牌号,使用车牌键盘输入,当时我把这个需求给砍了,然后在添加车辆信息时,老大看到数据库里我乱填的车牌号,又让我把他加上了^o^1.效果图2.相关代码使用组件形式实现键盘输入组件代码index.wxml <view class="carPlate" wx:if="{{show}}"> <block wx:if="{{type==1}}"> <view class="wordList"> <view class="wordItem" wx:for="{{cityKeyword1}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view> </view> <view class="wordList"> <view class="wordItem" wx:for="{{cityKeyword2}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view> </view> <view class="wordList"> <view class="wordItem" wx:for="{{cityKeyword3}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view> </view> <view class="wordList"> <view class="wordItem" wx:for="{{cityKeyword4}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view> </view> </block> <block wx:else> <view class="wordList"> <view class="wordItem" wx:for="{{keyNumber}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view> </view> <view class="wordList"> <view class="wordItem" wx:for="{{wordList1}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view> </view> <view class="wordList"> <view class="wordItem" wx:for="{{wordList2}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view> <view class="wordItem wordClear" bindtap="handleClick" data-item="delete"> <image src="/images/input-clear.png" class="clearImg"></image> </view> </view> <view class="wordList"> <view class="wordItem" wx:for="{{wordList3}}" wx:key="{{item}}" bindtap="handleClick" data-item="{{item}}">{{item}}</view> <view class="wordItem wordConfirm" bindtap="handleClick" data-item="confirm">确定</view> </view> </block></view>index.css.carPlate{ position: fixed; padding: 12rpx 12rpx 30rpx; left: 0; bottom: 0; width: 100%; /* height: 150px; */ font-size: 30rpx; background: #fff; box-sizing: border-box; border-top: 1px solid rgb(211, 207, 207); z-index: 200;}.wordList{ display: flex; width: 100%; justify-content: space-between; align-items: center;}.wordItem{ margin: 5rpx; width: 70rpx; height: 70rpx; line-height: 70rpx; text-align: center; border: 1px solid #eee; border-radius: 10rpx;}.wordConfirm{ width: 130rpx; color: #fff; background: #473af0;}.wordClear{ width: 100rpx;}.clearImg{ width: 60rpx; height: 60rpx; vertical-align: middle;}index.jsComponent({ properties: { type: { type: Number, default: 1, }, show: { type: Boolean, default: false, } }, data: { cityKeyword1: '京沪浙苏粤鲁晋冀豫', cityKeyword2: '川渝辽吉黑皖鄂湘赣', cityKeyword3: '闽陕甘宁蒙津贵云', cityKeyword4: '桂琼青新藏港澳台', keyNumber: '1234567890', wordList1: 'QWERTYUIOP', wordList2: 'ASDFGHJKL', wordList3: 'ZXCVBNM', }, methods: { handleClick(e) { let value = e.currentTarget.dataset.item; let type = e.currentTarget.dataset.type; switch(value) { case 'confirm': this.triggerEvent('confirm'); break; case 'delete': this.triggerEvent('delete'); break; default: this.triggerEvent('change', { value, type }); } } }})3.父组件引入我想实现点击输入后有上拉的效果,开始我想使用offset来实现的,但是下班后洗衣服想了下,不太好实现,我就想到了我以前做购物车时,有用到transform,原理差不多,我就把他用上了然后就是点击键盘外实现收起键盘,开始我想到的就是在父组件的最外层定义关闭事件,父级里面的盒子都使用catch方法阻止冒泡,但想下阻止冒泡好像又有点不合情理,就又把阻止冒泡给去掉了父组件index.wxml<view class="container" bindtap="handlePlateConfirm"> <view class="translateView" style="transform: translateY({{translateSpace}}px)"> <view class="list"> <view class="item"> <view class="label">*车牌号码</view> <view class="contentBox" catchtap="handleClick"> <view class="inputBox" wx:if="{{carNo}}">{{carNo}}</view> <view class="promptText" wx:else>请输入车牌号</view> </view> </view> </view> </view></view><car-plate show="{{showPlateInput}}" bindchange="handlePlateChange" type="{{inputType}}" bindconfirm="handlePlateConfirm" binddelete="handlePlateDelete" />父组件index.jsPage({ data: { carNo: '', translateSpace: 0, inputType: 1, // 车牌输入类型,1简称,2数字或者字母, showPlateInput: false, }, /* 用于点击弹出键盘输入,space为键盘弹出后向上拉取的距离 */ handleClick(e) { /* 150为键盘的高度 */ let space = -(e.currentTarget.offsetTop - 150); /* regExp用于判断当前已输入的车牌号是否是中文,并让键盘显示中文还是英文输入 */ let regExp = /^[\u4e00-\u9fa5]+/; let inputType = 1; if(regExp.test(this.data.carNo)) { inputType = 2; } this.setData({ translateSpace: space, showPlateInput: true, inputType }) }, /* 键盘输入操作 */ handlePlateChange(e) { let value = e.detail.value; let type = e.detail.type; let carNo = this.data.carNo; carNo += value; if(type == 1) { this.setData({ inputType: 2 }) } this.setData({ carNo }) }, /* 点击键盘上的确定 */ handlePlateConfirm() { /* isCarPlate用于判断输入的车牌号是否符合规范 */ if (!this.isCarPlate(this.data.carNo)) { wx.showToast({ title: '请输入正确的车牌号', icon: 'none', duration: 2000 }) return false; } this.setData({ translateSpace: 0, showPlateInput: false, inputType: 1 }) }, /* 用于键盘输入删除 */ handlePlateDelete(e) { let carNo = this.data.carNo; carNo = carNo.substring(0, carNo.length - 1); if(carNo.length == 0) { this.setData({ inputType: 1 }) } this.setData({ carNo, }) }, /* 判断车牌号 */ isCarPlate(value) { return /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test(value); }})父组件index.css.container{ height: 100vh; background: #fff;}.translateView{ background: #eee;}.list{ margin-bottom: 20rpx; background: #fff;}.list:last-child{ margin: 0;}.item{ display: flex; padding: 0 26rpx; width: 100%; height: 116rpx; box-sizing: border-box; align-items: center; border-bottom: 1px solid #eee;}.item:last-child{ border: none;}.label{ margin-right: 10rpx; width: 140rpx;}.contentBox{ display: flex; width: calc(100% - 150rpx); height: 90rpx; align-items: center; justify-content: space-between;}.promptText{ color: #c7c7c7;}.inputBox{ width: 100%; height: 80rpx; line-height: 80rpx;}正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)往期推荐: ...

August 19, 2019 · 3 min · jiezi

ES6-字符串与正则的扩展

1、字符串的扩展Unicode - \u0000 ~ \uFFFF '\{u0061}' // a '\uD842\uDfB7' "\u{20BB7}" // "????"字符串遍历器 - 识别大于0xFFFF let text2 = String.fromCodePoint(0x20BB7); for(let i = 0;i < text2.length;i++){ console.log(text2[i]); } // � // � for (let i of text){ console.log(i); } // "????"模板字符串 - 保留所有空格与换行 const getName = () => 'Iven'; const myName = 'Eric'; `\`Hello\` ${getName()},I am ${myName}` //"`Hello` Iven,I am Eric"标签模板 alert`111`; // alert(111); func`This ${ a + b} is ${ a * b}`; // func(['This', 'is', ''],a + b, a * b); <div> <span>1111</span> </div>新增方法 ...

August 8, 2019 · 2 min · jiezi

正则表达式位数和零宽断言

正则表达式位数和零宽断言之前的文章里,已经给大家展示了正则的匹配流程,希望大家能够好好回顾下。https://segmentfault.com/a/11...下面我们主要讨论两部分的内容:1. 正则表达式的位数,2. 零宽断言 正则表达式的位数在有需要正则表达式,很常见的操作就百度一下。看能不能找到满足我需求的。有时候你会找到的,比如手机校验,密码校验,邮箱校验。但是很多人往往都看不懂网上的正则的意思。这个就是学习正则的一个误区。在我看来,我们学习正则应该是:了解其匹配过程,再看懂正则表达式,最后才是自己写正则表达式。下面主要讲的就是怎么看懂正则表达式。而看懂正则表达式的关键--表达式匹配的字符位数。我们拿例子来说吧。 // 第一个例子,表达式匹配4个字符,一个“非语法关键字”的字符会占一位。var reg1 = /abcd/;// 第一个例子, 表达式匹配了5个字符(先是ab,再是abc里的任意一个,接着是cd)。说明下:[]范围内的内容能占一位,不管里面放了多少东西都是或的意思。var reg2 = /ab[abc]cd/;// 第三个例子, 匹配了5个或以上(先是ab,再是abc里的任意一个,接着是c,最后是一个d或者很多个d),这类的功能类似的*,{1,5}var reg3 = /ab[abc]cd+/;// 第四个例子,匹配4个(三个字符abd,和一个[])。 像^, $这类的标示位置的语法是不会占一个字符的,只是对位置的一些要求。var reg4 = /^ab[abc]d$/// 第五个例子(这个是个真实例子,不知道大家能否快速看清),匹配无数字符(首选匹配##item#七个字符,接着匹配任意字符的任意个,接着匹配字符#item##)// 这个里面的?是不要贪婪模式,其实这里说是遇到第一个#item##。关于贪婪模式,希望大家自己查阅下。var reg5 = /((##item#)([\w|\W])+?(#item##))/我是通过例子,想尽量说的直白点,让大家更容易理解。我这里面的例子并没有列全情况,如果大家有什么不理解的正则,不确定里面匹配多少位数,欢迎在下面留言,我看到就会给大家解答。下面我们说说零宽断言 零宽断言在说清楚零宽断言,我们需要简单介绍下为啥会有这个。它的存在是为了解决什么问题呢?这个存在是解决我们一些特定的要求,且不需要展占位数。比如:字符串的开头和结尾用"#"替换(/^|$/, 需要找到开头和结尾,又没有真实字符),数字字符串每隔三位添加一个逗号,字符串里b的后面不能是数字等等,这些都是对位置的条件,但这些条件本身又没有占位。 表示位置,又不占字符的语法总共就这些:^ $ \b \B (?=) (?!)^(脱字符)匹配开头,在多行匹配中匹配行开头。$(美元符号)匹配结尾,在多行匹配中匹配行结尾。b是单词边界,具体就是w和W之间的位置,也包括w和^之间的位置,也包括w和$之间的位置。B就是b的反面的意思,非单词边界。例如在字符串中所有位置中,扣掉b,剩下的都是B的。以上4个比较简单,尤其是^ 和$,这里就不多说了。下面主要说说这两个(?=)和(?!)(?= P)表示的此刻位置后面应该是P模式,这个模式不单单是字符,也可能是复杂正则。比如(?= l),(?= [abc]ede), (?= \d +) (?!p) 表示的此刻位置后面应该是P模式的以外的位置,和上一个正好相反。举几个例子帮助理解下 // 第一个例子, 正则的表达式,要求在cate后位置的后面应该是一个数字。再之后应该是数字位,再之后是ok。\d是不能少的,也很好的说明了(?=)是不占位。var reg6 = /cate(?=\d)\dok/var str = 'cate3ok'str.match(reg6); // cate3ok// 第二个例子,如果我们想在##p#和#p##之前的字符串里有ok字符这段字符串。var reg7 = /##p#(?=.*ok).*#p##/var str1 = '##p#fsdfsdokdfsdfs#p##'reg7.test(str1);// 第三个例子,如果我们想在##p#和#p##之前的字符串里有ok字符这段字符串。如果字符串里有两段##p#怎么办呢?var reg7 = /##p#(?=.*ok).*#p##/var str1 = '##p#fsokfs#p####p#fsfs#p##'str1.match(reg7) // ##p#fsokfs#p####p#fsfs#p## 这个结果就不是我们想要的了。不知大家能否想明白?// 我们把正则改下var reg8 = /##p#(?=.*ok).*?#p##/str1.match(reg8) //##p#fsokfs#p##// 好像是对了哦,但是我们把字符串改下, 两段##p#换个位置var str2 = '##p#fsfs#p####p#fsokfs#p##';str2.match(reg8) // ##p#fsfs#p## 又不对了。 这个地方不知能否想明白。// 我们再把正则改下var reg9 = /##p#(?=(.(?!#p##))*ok).*?#p##/;str2.match(reg9); // ##p#fsokfs#p## 这次就对上了。我想对最后的正则进行解释下。 首选是?#p## 这个地方的?是告诉正则我不用贪婪模式,(?=(.(?!#p##)).*ok).* 这部分里我们先不看里面的?部分,把它当成P(?=p.*ok).*, 这部分意思,我们需要任意字符,在任意字符的后面任意位置应该出现一个OK。最后里面的?部分,其实也是对这个任意字符的条件,要求任意字符后面不能是#p##字符串。这样就实现了啦。 ...

August 7, 2019 · 1 min · jiezi

浅谈正则表达式原理

原文:浅谈正则表达式原理 | AlloyTeam作者:TAT.liberty正则表达式可能大部分人都用过,但是大家在使用的时候,有没有想过正则表达式背后的原理,又或者当我告诉你正则表达式可能存在性能问题导致线上挂掉,你会不会觉得特别吃惊? 我们先来看看7月初,因为一个正则表达式,导致线上事故的例子。 https://blog.cloudflare.com/d... 简单来说就是一个有性能问题的正则表达式,引起了灾难性回溯,导致cpu满载。 性能问题的正则先看看出问题的正则 引起性能问题的关键部分是 .*(?:.*=.*) ,这里我们先不管那个非捕获组,将性能问题的正则看做 .*.*=.* 。 其中 . 表示匹配除了换行以外的任意字符(很多人把这里搞错,容易出bug), .* 表示贪婪匹配任意字符任意次。 什么是回溯在使用贪婪匹配或者惰性匹配或者或匹配进入到匹配路径选择的时候,遇到失败的匹配路径,尝试走另外一个匹配路径的这种行为,称作回溯。 可以理解为走迷宫,一条路走到底,发现无路可走就回到上一个三岔口选择另外的路。 回溯现象// 性能问题正则// 将下面代码粘贴到浏览器控制台运行试试const regexp = `[A-Z]+\\d+(.*):(.*)+[A-Z]+\\d+`;const str = `A1:B$1,C$1:D$1,E$1:F$1,G$1:H$1`const reg = new RegExp(regexp);start = Date.now();const res = reg.test(str);end = Date.now();console.log('常规正则执行耗时:' + (end - start))现在来看看回溯究竟是怎么一回事 假设我们有一段正则 (.*)+\d ,这个时候输入字符串为 abcd ,注意这个时候仅仅输入了一个长度为4的字符串,我们来分析一下匹配回溯的过程: 上面展示了一个回溯的匹配过程,大概描述一下前三轮匹配。 注意 (.*)+ 这里可以先暂且看成多次执行 .* 。 (.*){1,} 第一次匹配,因为 .* 可以匹配任意个字符任意次,那么这里可以选择匹配空、a、ab、abc、abcd,因为 * 的贪婪特性,所以 .* 直接匹配了 abcd 4个字符, + 因为后面没有其他字符了,所以只看着 .* 吃掉 abcd 后就不匹配了,这里记录 + 的值为1,然后 \d 没有东西能够匹配,所以匹配失败,进行第一次回溯。 ...

July 15, 2019 · 2 min · jiezi

经验拾忆纯手工-Python正则全解详解

预编译import rere1 = re.compile(r'元字符 组成的正则规则') # 元字符下面会说re1.方法() # 方法下边也会说元字符:表示普通字符: . # 除了\n外 都可以匹配的到 \d # 只匹配 纯数字 0-9 \D # 和 \d相反, 除了数字全都匹配 \s # 只匹配空格 \S # 和 \s相反,除了空格,全都匹配 # 我喜欢用 [\s\S]*? 匹配所有 \w # 只匹配 纯数字 或 大小写字母 或 下划线 \W # 与 \w 恰好相反, 除了 纯数字、大小写字母、下划线 全都匹配 [] # [abcde] 只要包含这个列表的字符,都可以匹配的到。但默认只取一个, 简写 [a-e] eg: re.compile(r'[e-h]').match('hello python ').group(0) >>> h 此外: [^abcde] 或 [^a-e] 表示 '排除',意思就是 除了abcde全匹配 匹配表示边界的: ^ # 匹配 起始 位置,受 re.M 影响 #注意:不要和 [^123] 除123之外搞混 eg: import re r1 = re.compile(r'^\d+') print(r1.search('456hello123').group()) >>> 456 $ # 匹配 结尾 位置,受 re.M 影响 eg: import re s = """ 123abc456 678abc789 """ r1 = re.compile(r'\d+$',re.M) # 注意这里加入了re.M print(r1.findall(s)) >>> ['456', '789'] # 这是写了re.M,就意味着 每一行都给你单独按照规则处理 >>> ['789'] # 如果没写re.M, 那么就按照整体,去最后一行的尾部 注: 其实re.M的本质是 是根据\n,进行 断行,断行后对每一行按照规则单独处理 \b: # 匹配 单词的 边界(除了 数字、中英字母、下划线 的 所有符号) eg: import re s = '你好啊----好个P' r1 = re.compile(r'\b好') print(r1.findall(s)) >>> 好 # 解释:这个‘好’是,后面 的那个。因为后面的 ’好‘ 字 左边是符号,而非单词字符 \B: # 匹配 单词 非 边界(包括 数字、中英字母、下划线) eg: import re s = '你好啊----好个P' r1 = re.compile(r'\b好') print(r1.findall(s)) >>> 好 # 解释:这个‘好’是,前面 的那个。因为前面的 ’好‘ 字 左边是中文字符。属于非边界 # 所以就匹配上了 再次总结: \b 与 \B: \b: 匹配边界字符。边界字符:(除了 数字、字母、汉字、下划线的所有符号) \B: 匹配非边界字符。非边界字符:(数字、字母、汉字、下划线) 匹配表示数量的: * : 0次 或 多次 eg: 你* + : 1次 或 多次 eg: 你+ ? : 0次 或 一次 eg: 你? {m} : 出现m次 eg: 你{3} {m,} : 至少 出现m次 eg: 你{3,} # 涉及到贪婪模式,不深的不要用 {m,n}: m次 到 n次 之间任意一次就行 eg: 你{3,6} 表示分组: | : 相当于或运算符, 两边写的是 正则表达式, 优先选择左边的 () : 括起来里面的内容,就变成了分组。 可以用 .group(1)提取,如果有更多那就 group(2).. (?P<name>) : 在上面分组的基础上 起别名 (?P=name) : 根据分组的别名来使用分组 eg: s = '<h1>你好</h1>' r1 = re.compile(r'<(?P<name1>\w+)>(\w+)</(?P=name1)>').match(s).group(2) print(r1) >>> 你好 \数字 :提取的分组可以在 同一个正则中 复用 eg: s = '<h1>你好</h1>' r1 = re.compile(r'<(\w+)>(\w+)</\1>') # \1 代表复用第一个分组 print(r1.match(s).group(2)) # 2代表提取第二个分组 >>> 你好匹配模式re.M # 多行匹配, 影响 ^ 和 $,上面讲 ^ 与 $已经详解了。re.I # 忽略大小写 eg: s = 'aAbB' r1 = re.compile(r'aabb', re.I).match(s).group() print(r1) >>> aAbBre.S # 提升 . 的权限, 让 . 可以 匹配到换行符 s = """ hello python """ r1 = re.compile(r'.*', re.S).match(s).group() # 注意这里 re.S print(r1) >>> hello python 注意:如果不写 re.S 那么 .* 只能匹配到第一行的空字符串,因为遇到第一个空行的\n就停止了 re.X # 可以给正则分行写,并可以加注释, eg: import re title = '1好2你3' r1 = re.compile(r""" 1 # 注释1 看这两行 好 # 注释2 看这两行,1 和 好 没有加逗号。但是他们属于整体的规则,你可以加注释 """, re.X) # 把正则可以分行写, 用了re.X后,分行的正则会被看作为一行 result = r1.match(title).group() print(result) # 输出结果: 1好贪婪模式 与 非贪婪模式个人理解: 贪婪模式:(Python默认使用的就是 贪婪模式) 你想匹配 一个句子中的 一个单词, 但是你写的规则恰好可以 满足 匹配所有单词。 那么它就会 贪婪的 把所有单词 全部 都给你匹配出来。 (贪) 使用方法: * 或 + 非贪婪模式: 即使你把规则写的很好,并且能把所有字符串都匹配到, 但是如果你加上了 非贪婪模式。 在满足规则条件的前提下,只匹配一个. 使用方法: *? 或 +? eg1:基于search的贪婪模式(match同此) 我们先回忆一下:search()方法的 最核心思想就是:从前往后搜,搜到一个满足的就直接返回。 OK,继续。 贪婪:(默认): import re r1 = re.compile(r'\d+') print(r1.search('你好333你好333你好').group()) >>> 333 # 满足规则后 尽可能贪, 所以第一串连着的 '333' 搜到了就直接返回了 非贪婪(就多了个问号 ? ): import re r1 = re.compile(r'\d+?') print(r1.search('你好333你好333你好').group()) >>> 3 # 嗯,你的规则就是 至少一个数字,搜到了一个就可以返回了,干得漂亮。 eg2: 基于findall的贪婪模式(如果你findall与规则,理解的不透彻,这个会有点绕的,前方高能) 先回忆一下:findall()方法的 最核心思想就是:拿着 定死的 规则,把所有满足规则的都提出来 OK,继续。 贪婪(默认): import re r1 = re.compile(r'\d+') print(r1.findall('你好333你好333你好')) >>> ['333', '333'] 解释: 规则是匹配至少一位数字。 但是 贪婪模式 提醒了 规则:“你的任务是给我尽可能的 多匹配数字” findall 拿着 被贪婪化的 规则 去匹配原始字符串 被贪婪模式 提醒过的规则果然不负众望, 一次提一串连着的 ‘333‘ findall 拿着它 提取了 两次 ,就把所有数字提取出来了 结果就是 ['333', '333'] 非贪婪: import re r1 = re.compile(r'\d+?') print(r1.findall('你好333你好333你好')) >>> ['3', '3', '3', '3', '3', '3'] 解释: 规则 同样是 匹配至少一位数字。 但是 非 贪婪模式 提醒了 规则:“你的任务是给我尽可能的 少 匹配数字” findall 拿着 被贪婪化的 规则 去匹配原始字符串 被贪婪模式 提醒过的规则果然不负众望, 一次只提取一个 ‘3‘ findall 拿着它 提取了 六次 ,才把所有数字提取出来了 结果就是 ['3', '3', '3', '3', '3', '3']匹配方法match(): ''' match()方法是 根据规则从第一个开始,向后逐个匹配,如果有一个字符匹配不上,就返回None ''' s = 'hello python' re1 = re.compile(r'he') re1.match('') result = re1.match(s).group() if re1.match(s) else None # 注意:非None才有group方法 print(result) # 通过 group()方法获得的才是最终 正则匹配的字符串 >>> he 简单分组提取: s = 'hello python' re1 = re.compile(r'h(e)llo') # 给e加个一个(),就代表添加了分组,一会要把他提出来 result = re1.match(s).group(1) if re1.match(s) else None # 注意上方的 group(1) 这个参数是1,代表 只 提取 分组 里面的内容 >>> e # 如果是 group() 或 group(0) 代表提取 整个正则规则 的内容 >>> hello print(result) >>> e 嵌套-平行(深度-广度)分组提取: 原理:分组提取先提取嵌套的,后提取平行的 (专业点就是先深度,后广度) eg: a = '123-%%%-dd' result = re.compile(r'123(-(%%%)-)d(d)').match(a).groups() # 或者用 group(1), group(2), group(3) 代替groups() 单个看也行 print(result) >>> ('-%%%-', '%%%', 'd') search(): """ search() 方法是: 从前向后按规则‘搜索’, 直到搜到位置,搜不到就返回None """ s = "aaa123aaa" r1 = re.compile(r'\d+').search(s).group() print(r1) >>> 123findall(): """ findall() 方法是: 按照正则规则,搜索所有符合规则的字符串,以列表的形式作为结果返回 """ s = "aaa---123---bbb" r1 = re.compile(r'\w+').findall(s) print(r1) >>> ['aaa', '123', 'bbb'] 微不足道的扩展: a = '123-%%%-dd' result = re.compile(r'-(.*?)-').findall(a) print(result) >>> %%% # 解释: findall() 方法中 如果规则中含有分组,那么就会只返回分组中提取的的内容 finditer(): """ finditer() 和 findall() 使用方式一样,只不过返回结果是 可迭代对象,easy,此处不在多说 """ split(): """ split()方法是:按照规则去切割,切割结果以列表的方式返回 """ 语法关联: 我们知道字符串 有 split() 方法,可以按照一个参数损耗来切割,但是这个参数只能指定一个 如果让你在多种规则的前提下切割,需要怎么办。 巧了,正则切割split() 方法就是解决这个问题的, 实例如下: s = "aaa%%123@@bbb" # 可以看见,%和@符号把字符分开了,现在我们只想要字符 r1 = re.compile(r'\W+').split(s) # \W 大写: 以非单词性字符作为损耗规则,来切割 print(r1) >>> ['aaa', '123', 'bbb']sub(): """ sub()方法是: 按照规则匹配选出代替换的字符,然后自己 给定字符去替换 """ 场景1:常用方式,自己给定目标字符串,按规则匹配并直接替换原始字符串 eg: s = "aaa%%123@@bbb" r1 = re.compile(r'\W+').sub('你好',s) print(r1) >>> aaa你好123你好bbb 场景2:正则匹配后的结果 经过函数操作,函数的返回值作为 替换的最终结果 eg: s = "aaa%%123@@bbb" r1 = re.compile(r'\W+').sub(lambda a:a.group()*2, s) print(r1) >>> aaa%%%%123@@@@bbb 解释: 按照规则匹配到的字符是 %%和@@,经过函数 乘以2后, 就替换成了 %%%%和@@@@ subn(): """ subn() 和 sub()语法几乎一样,唯一的扩展功能就是 返回结果是元组,(字符串, 次数) """ s = "aaa%%123@@bbb" r1 = re.compile(r'\W+').subn('你好',s) print(r1) >>> ('aaa你好123你好bbb', 2)

July 7, 2019 · 4 min · jiezi

js中与字符串正则表达式有关的函数

直接量语法/pattern/attributes 创建 RegExp 对象的语法:new RegExp(pattern, attributes); 参数参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。 返回值一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。 let a = '1234567890123'; let b = /1/g; // 这个才是标准 // 等于 b = new RegExp(/1/, 'g') // 这个也是标准,下面没报错,但不推荐 // 等于 b = new RegExp(/1/g) // 等于 b = RegExp(/1/g) // 等于 b = RegExp(/1/, 'g') a.replace(b,'') // "23456789023"使用字符串方法字符串方法 : str.search(regular) 、str.replace(regular)、regular.test(str) ...

July 4, 2019 · 1 min · jiezi

正则表达式位数和零宽断言

正则表达式位数和零宽断言之前的文章里,已经给大家展示了正则的匹配流程,希望大家能够好好回顾下。https://segmentfault.com/a/11...下面我们主要讨论两部分的内容:1. 正则表达式的位数,2. 零宽断言 正则表达式的位数在有需要正则表达式,很常见的操作就百度一下。看能不能找到满足我需求的。有时候你会找到的,比如手机校验,密码校验,邮箱校验。但是很多人往往都看不懂网上的正则的意思。这个就是学习正则的一个误区。在我看来,我们学习正则应该是:了解其匹配过程,再看懂正则表达式,最后才是自己写正则表达式。下面主要讲的就是怎么看懂正则表达式。而看懂正则表达式的关键--表达式匹配的字符位数。我们拿例子来说吧。 // 第一个例子,表达式匹配4个字符,一个“非语法关键字”的字符会占一位。var reg1 = /abcd/;// 第一个例子, 表达式匹配了5个字符(先是ab,再是abc里的任意一个,接着是cd)。说明下:[]范围内的内容能占一位,不管里面放了多少东西都是或的意思。var reg2 = /ab[abc]cd/;// 第三个例子, 匹配了5个或以上(先是ab,再是abc里的任意一个,接着是c,最后是一个d或者很多个d),这类的功能类似的*,{1,5}var reg3 = /ab[abc]cd+/;// 第四个例子,匹配4个(三个字符abd,和一个[])。 像^, $这类的标示位置的语法是不会占一个字符的,只是对位置的一些要求。var reg4 = /^ab[abc]d$/// 第五个例子(这个是个真实例子,不知道大家能否快速看清),匹配无数字符(首选匹配##item#七个字符,接着匹配任意字符的任意个,接着匹配字符#item##)// 这个里面的?是不要贪婪模式,其实这里说是遇到第一个#item##。关于贪婪模式,希望大家自己查阅下。var reg5 = /((##item#)([\w|\W])+?(#item##))/我是通过例子,想尽量说的直白点,让大家更容易理解。我这里面的例子并没有列全情况,如果大家有什么不理解的正则,不确定里面匹配多少位数,欢迎在下面留言,我看到就会给大家解答。下面我们说说零宽断言 零宽断言在说清楚零宽断言,我们需要简单介绍下为啥会有这个。它的存在是为了解决什么问题呢?这个存在是解决我们一些特定的要求,且不需要展占位数。比如:字符串的开头和结尾用"#"替换(/^|$/, 需要找到开头和结尾,又没有真实字符),数字字符串每隔三位添加一个逗号,字符串里b的后面不能是数字等等,这些都是对位置的条件,但这些条件本身又没有占位。 表示位置,又不占字符的语法总共就这些:^ $ \b \B (?=) (?!)^(脱字符)匹配开头,在多行匹配中匹配行开头。$(美元符号)匹配结尾,在多行匹配中匹配行结尾。b是单词边界,具体就是w和W之间的位置,也包括w和^之间的位置,也包括w和$之间的位置。B就是b的反面的意思,非单词边界。例如在字符串中所有位置中,扣掉b,剩下的都是B的。以上4个比较简单,尤其是^ 和$,这里就不多说了。下面主要说说这两个(?=)和(?!)(?= P)表示的此刻位置后面应该是P模式,这个模式不单单是字符,也可能是复杂正则。比如(?= l),(?= [abc]ede), (?= \d +) (?!p) 表示的此刻位置后面应该是P模式的以外的位置,和上一个正好相反。举几个例子帮助理解下 // 第一个例子, 正则的表达式,要求在cate后位置的后面应该是一个数字。再之后应该是数字位,再之后是ok。\d是不能少的,也很好的说明了(?=)是不占位。var reg6 = /cate(?=\d)\dok/var str = 'cate3ok'str.match(reg6); // cate3ok// 第二个例子,如果我们想在##p#和#p##之前的字符串里有ok字符这段字符串。var reg7 = /##p#(?=.*ok).*#p##/var str1 = '##p#fsdfsdokdfsdfs#p##'reg7.test(str1);// 第三个例子,如果我们想在##p#和#p##之前的字符串里有ok字符这段字符串。如果字符串里有两段##p#怎么办呢?var reg7 = /##p#(?=.*ok).*#p##/var str1 = '##p#fsokfs#p####p#fsfs#p##'str1.match(reg7) // ##p#fsokfs#p####p#fsfs#p## 这个结果就不是我们想要的了。不知大家能否想明白?// 我们把正则改下var reg8 = /##p#(?=.*ok).*?#p##/str1.match(reg8) //##p#fsokfs#p##// 好像是对了哦,但是我们把字符串改下, 两段##p#换个位置var str2 = '##p#fsfs#p####p#fsokfs#p##';str2.match(reg8) // ##p#fsfs#p## 又不对了。 这个地方不知能否想明白。// 我们再把正则改下var reg9 = /##p#(?=(.(?!#p##))*ok).*?#p##/;str2.match(reg9); // ##p#fsokfs#p## 这次就对上了。我想对最后的正则进行解释下。 首选是?#p## 这个地方的?是告诉正则我不用贪婪模式,(?=(.(?!#p##)).*ok).* 这部分里我们先不看里面的?部分,把它当成P(?=p.*ok).*, 这部分意思,我们需要任意字符,在任意字符的后面任意位置应该出现一个OK。最后里面的?部分,其实也是对这个任意字符的条件,要求任意字符后面不能是#p##字符串。这样就实现了啦。 ...

July 1, 2019 · 1 min · jiezi

查找到文中的关键字给关键字添加上超级链接

查找到文中的关键字,给关键字添加上超级链接。查找到文中的关键字,给关键字添加上超级链接,如果有进行关键词替换的需求仍然可以基于这个类进行修改。替换顺序按照数组的索引来的,可以把规则写入数据里,并添加权重字段,可以动态调整关键词替换或者添加超级链接的优先级。 <?php/** * 给文章中的匹配到字符添加上a连接 * Created by PhpStorm. * User: smallForest<1032817724@qq.com> * Date: 2019-06-06 * Time: 09:19 */class addLink{ protected $content = ''; protected $replace_rules = []; public function __construct($content, $replace_rules) { $this->content = $content; $this->replace_rules = $replace_rules; } public function do_replace() { //执行替换返回替换后的字符串 if (!empty($this->replace_rules)) { foreach ($this->replace_rules as $rule) { $this->content = preg_replace('/(?!<[^>]*)' . $rule['key_word'] . '(?![^<]*(>|<\/[a|sc]))/s', '<a href="' . $rule['url'] . '" target="' . $rule['target'] . '" >' . $rule['key_word'] . "</a>", $this->content, $rule['replace_times'], $count);//通过判断count字段大于0 可以得知替换发送 } } return $this->content; }}$rule = [ [ 'key_word' => '中国人',//关键词 'url' => 'http://www.baidu.com?id=中国人',//需要加的超链 'target' => '_blank',//打开方式 'replace_times' => 1,//允许替换的次数次数 -1为不限制次数! ], [ 'key_word' => '中国',//关键词 'url' => 'http://www.baidu.com?id=中国',//需要加的超链 'target' => '_blank',//打开方式 'replace_times' => 1,//允许替换的次数次数 -1为不限制次数! ], [ 'key_word' => '人', 'url' => 'http://www.baidu.com?id=人', 'target' => '_blank', 'replace_times' => 1, ],];$obj = new addLink('我是中国人', $rule);echo $obj->do_replace();

June 6, 2019 · 1 min · jiezi

常用正则表达式公式总结

一、校验数字的表达式数字:^[0-9]\*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]\*)$非零开头的最多带两位小数的数字:^([1-9][0-9]\*)+(\.[0-9]{1,2})?$带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$非零的正整数:^[1-9]\d\*$ 或 ^([1-9][0-9]\*){1,3}$ 或 ^\+?[1-9][0-9]\*$非零的负整数:^\-[1-9][]0-9"\*$ 或 ^-[1-9]\d\*$非负整数:^\d+$ 或 ^[1-9]\d\*|0$非正整数:^-[1-9]\d\*|0$ 或 ^((-\d+)|(0+))$非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*|0?\.0+|0$非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*))|0?\.0+|0$正浮点数:^[1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*$ 或 ^(([0-9]+\.[0-9]\*[1-9][0-9]\*)|([0-9]\*[1-9][0-9]\*\.[0-9]+)|([0-9]\*[1-9][0-9]\*))$负浮点数:^-([1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*)$ 或 ^(-(([0-9]+\.[0-9]\*[1-9][0-9]\*)|([0-9]\*[1-9][0-9]\*\.[0-9]+)|([0-9]\*[1-9][0-9]\*)))$浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d\*\.\d\*|0\.\d\*[1-9]\d\*|0?\.0+|0)$二、校验字符的表达式汉字:^[\u4e00-\u9fa5]{0,}$英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$长度为3-20的所有字符:^.{3,20}$由26个英文字母组成的字符串:^[A-Za-z]+$由26个大写英文字母组成的字符串:^[A-Z]+$由26个小写英文字母组成的字符串:^[a-z]+$由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$可以输入含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+禁止输入含有~的字符:[^~\x22]+三、特殊需求表达式Email地址:^\w+([-+.]\w+)\*@\w+([-.]\w+)\*\.\w+([-.]\w+)\*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?InternetURL:[a-zA-z]+://[^\s]\* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]\*)?$手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.\*\d)(?=.\*[a-z])(?=.\*[A-Z])[a-zA-Z0-9]{8,10}$强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.\*\d)(?=.\*[a-z])(?=.\*[A-Z]).{8,10}$日期格式:^\d{4}-\d{1,2}-\d{1,2}一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$钱的输入格式: 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]\*$这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]\*)$一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]\*)$这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})\*(.[0-9]{1,2})?$1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})\*)(.[0-9]{1,2})?$备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$中文字符的正则表达式:[\u4e00-\u9fa5]双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))空白行的正则表达式:\n\s\*\r (可以用来删除空白行)HTML标记的正则表达式:<(\S\*?)[^>]\*>.\*?|<.\*? /> ( 首尾空白字符的正则表达式:^\s\*|\s\*$或(^\s\*)|(\s\*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

June 5, 2019 · 1 min · jiezi

同样是Python怎么区别这么大

发现问题上周,我的测试同事告诉我,你的用户名怎么还允许中文啊?当时我心里就想,你们测试肯定又搞错接口了,我用的是正则w过滤了参数,怎么可能出错,除非Python正则系统出错了,那是不可能的。本着严谨的作风,我自己先测试一下,没问题看我怎么怼回去。可是当我测试,我就懵逼了,中文真TM都验证通过,不对啊,我以前也是这么过滤参数的,测试没问题啊?唯一的区别是现在用的是Python3。上网搜了一圈,发现没有一篇文章讲述Python2和Python3的正则在处理字符串是的区别,都是一视同仁,知道我去翻了一遍官方文档,才明白怎么回事。 问题复现我们都知道,Python有个正则规则w,几乎所有的网上博客文章都告诉你,这个规则匹配字母数字及下划线,但实际并不是这样:有Python2代码如下: ~|⇒ pythonPython 2.7.10 (default, Aug 17 2018, 19:45:58)[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.0.42)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import re>>> aa = '捕蛇者说'>>> re.match('\w{1,20}', aa)>>> bb = 'abc123ADB'>>> re.match('\w{1,20}', bb)<_sre.SRE_Match object at 0x1031b0b28>我们可以看到,在python2中,w是无法匹配中文的。那么,同样的代码在Python3中运行结果是什么样子的了? ~|⇒ python3Python 3.7.1 (default, Nov 28 2018, 11:55:14)[Clang 9.0.0 (clang-900.0.39.2)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import re>>> aa = '捕蛇者说'>>> re.match('\w{1,20}', aa)<re.Match object; span=(0, 4), match='捕蛇者说'>>>> bb = 'abc123ADB'>>> re.match('\w{1,20}', bb)<re.Match object; span=(0, 9), match='abc123ADB'>但在Python3中w是可以匹配中文的,这是怎么回事了?要回答这个问题,我们要回到Python官方文档中来寻找答案。 ...

May 28, 2019 · 1 min · jiezi

正则表达式中隐藏的陷阱

几天前,一个在线项目的监控系统突然报告了一个例外。在检查相关资源的使用情况后,我们发现CPU利用率接近100%。然后我们使用Java附带的thread dump工具导出问题的堆栈信息。 我们可以看到所有堆栈都指向一个被调用的方法validateUrl,它在堆栈上获得了100多条错误消息。通过对代码进行故障排除,我们知道该方法的主要功能是验证URL是否合法。 那么正则表达式如何导致高CPU利用率。为了重现问题,我们提取关键代码并进行简单的单元测试。 public static void main(String[] args) { String badRegex = "^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$"; String bugUrl = "http://www.fapiao.com/dddp-web/pdf/download?request=6e7JGxxxxx4ILd-kExxxxxxxqJ4-CHLmqVnenXC692m74H38sdfdsazxcUmfcOH2fAfY1Vw__%5EDadIfJgiEf"; if (bugUrl.matches(badRegex)) { System.out.println("match!!"); } else { System.out.println("no match!!"); }}当运行上面的示例时,通过资源监视器,我们可以看到一个被调用的进程java的CPU利用率飙升至91.4%。 现在几乎可以判断正则表达式就是导致CPU利用率高的原因! 所以,让我们关注正则表达式: ^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$分解一下上面的正则表达式: 它匹配第一部分中的http和https协议,匹配www.第二部分中的字符,并匹配第三部分中的其他字符。我盯着正则表达很长一段时间并没有发现任何大问题。 实际上,这里CPU使用率高的关键原因是Java正则表达式使用的引擎实现是NFA,在执行字符匹配时执行回溯。一旦发生回溯,所需的时间将变得非常长。可能是几分钟甚至几个小时。时间量取决于回溯的数量和复杂性。 顺便说一下,也许有些人仍然不清楚回溯是什么。没关系,让我们从正则表达式的原则入手。 正则表达式引擎正则表达式是一组方便的匹配符号。要实现这种复杂而强大的匹配语法,我们必须拥有一组算法,并且算法的实现称为正则表达式引擎。简而言之,有两种方法可以实现正则表达式引擎:(DFA确定性最终自动机)和NFA(非确定性有限自动机)。 这两个自动机是不同的,我们不会深入研究它们的原理。简单地说,时间复杂度DFA是线性的,更稳定但功能有限。时间复杂度NFA相对不稳定,所以有时它非常好,有时它不是,取决于你写的正则表达式。但其优点NFA是其功能更强大,因此Java,.NET,Perl,Python,Ruby和PHP等语言使用NFA来实现其正则表达式。 如何在NFA 比赛?我们使用以下字符和表达式作为示例。 text="Today is a nice day."regex="day"请注意,NFA匹配是基于正则表达式。也就是说,NFA将读取正则表达式的一个字符并将其与目标字符串匹配。如果匹配成功,它将转到正则表达式的下一个字符,否则它将继续与目标字符串的下一个字符进行比较。 让我们一步一步地看看上面的例子。 首先,取正则表达式的第一个匹配字符:  d。然后将它与字符串的第一个字符进行比较,即T. 它不匹配,所以转到下一个字符  。第二个字符是  o,它也不匹配。所以继续下一个,  d 现在。它匹配。然后阅读常规的第二个字符:  a。正则表达式的第二个匹配字符:  a。它将与字符串的第四个字符进行比较  a. 。它再次匹配。然后继续阅读正则表达式的第三个字符  y。正则表达式的第三个匹配字符是  y。让我们继续将它与字符串的第五个字符匹配,然后匹配。然后尝试读取正则表达式的下一个字符,发现没有,所以匹配结束。以上是匹配过程,NFA实际匹配过程要复杂得多。但是,匹配原则是一样的。 Backtracking(回溯)NFA既然您已经学会了如何NFA执行字符串匹配,那么让我们来谈谈文章的重点:回溯。为了更好地解释回溯,我们将使用以下示例。 text="abbc"regex="ab{1,3}c"这是一个相对简单的例子。正则表达式  a 以及以它结尾  c,并且在它们之间有一个1-3个b 字符的字符串  。匹配过程NFA是这样的: 首先,取正则表达式的第一个匹配字符,即将  a, 其与字符串的第一个字符进行比较  a。它匹配,所以移动到正则表达式的第二个字符。取正则表达式的第二个匹配字符,即将 b{1,3}, 其与字符串的第二个字符进行比较  b. 再次匹配。但是由于  b{1,3} 表示1-3个  b 字符串和贪婪的性质NFA(即尽可能匹配),它此时不会读取正则表达式的下一个字符,但仍然b{1,3} 与字符串的第三个字符进行比较  ,这  b 也是。它也匹配。然后它将继续使用  b{1,3} 与字符串的第四个字符进行比较  c,并发现它不匹配。 此时发生回溯 。回溯如何运作?在回溯之后,c已经读取的字符串的第四个字符(即  )将被吐出,指针将返回到字符串的第三个字符。之后,它将读取c 正则表达式的下一个字符  ,并将其与c 当前指针的下一个字符进行比较  ,并匹配。然后阅读下一篇,但结束了。让我们回过头来看一下用于验证URL的正则表达式: ...

May 24, 2019 · 1 min · jiezi

正则表达式-字符匹配不以某字段开头或者结尾

我的博文地址: https://www.luoyangfu.com/art...最近有一个需求,要求是判断某个字符串不以什么开头。然后就开始探索这个不以什么开头和不易什么结尾的正则怎么写,why? 不以某字符串开头这里需要提一个概念叫 否定式前项匹配 这个东东。 向前匹配根据匹配的字符序列后面存在一个特定的字符序列或者不存在一个特定的序列来决定是否匹配。对于向前匹配,出现在指定项后面的字符序列不会被正则表达式返回。 这里说后面存在一个特定字符序列, 也称之为肯定式向前查找不存在一个特定的序列,也称之为否定式向前查找这两个概念后续再深入开始解决这个问题不以某字符串开头: ^(?!str)这里使用了下面几个元符号: ^ 判断是否是开头?! 这里是否定向前查询示例: 不以test 开头字符串/^(?!test).*/ 不以某字符串结尾这里要说一个概念叫 否定式向后匹配,前面说了向前匹配,想后匹配呢? 向后匹配一个要匹配的字符串序列前面有或者没有指定的字符串序列 这里有指定字符串序列也叫 肯定式向后匹配这里没有指定字符串序列也叫 否定式向后匹配这两个概念后续深入解决不以某字符串结尾: (?<!str)$这里用了如下几个符号: ?<! 否定式向后查询$ 是否结尾示例: 不以 end 结尾 /.*(?<!end)$/ 收集几个 ? 元字符用法(?:str) 非捕获组(?=str) 肯定式向前查找(?!str) 否定式向前查找(?<=str) 肯定式向后查找(?<!str) 否定式向后查找参考地址: https://blog.csdn.net/LinBili...https://blog.csdn.net/libingx...

May 23, 2019 · 1 min · jiezi

小程序richtext组件如何改变内部img图片样式

一、起因小程序中有一个页面,很奇葩,是通过后端传过来的整段HTML字符串展示内容的,那么我们暂时叫这个页面为content,传过来之后,他里面的图片样式是不固定的,有的大,有的小,有的有style有的没有,那我怎么能让他统一展示成一样的样式呢? 二、办法思前想后,我觉得还是正则比较靠谱,把content里面所有的img标签筛选出来,把里面有style的、有width的、有height的、全部删除掉,最后在统一加上我们想要的样式,最终代码如下: <RichText nodes={content} /> 下面是HTML字符串处理过程 let html = content .replace(/<p([\s\w"=\/\.:;]+)((?:(style="[^"]+")))/ig, '<p') .replace(/<p>/ig, '<p style="font-size: 15Px; line-height: 25Px;">') .replace(/<img([\s\w"-=\/\.:;]+)((?:(height="[^"]+")))/ig, '<img$1') .replace(/<img([\s\w"-=\/\.:;]+)((?:(width="[^"]+")))/ig, '<img$1') .replace(/<img([\s\w"-=\/\.:;]+)((?:(style="[^"]+")))/ig, '<img$1') .replace(/<img([\s\w"-=\/\.:;]+)((?:(alt="[^"]+")))/ig, '<img$1') .replace(/<img([\s\w"-=\/\.:;]+)/ig, '<img$1 style="width: 100%; border-radius: 8Px;"');最终实现了我们想要的样式统一的效果啦~ 三、总结我有想过直接在less里面取到img,然后改变它的样式,这种办法在h5中是可行的,但是在小程序中不起作用!因为在小程序中会是一整个rich-text标签,里面的内容样式无法修改。所以采用这种办法啦~~能够解决问题。

May 21, 2019 · 1 min · jiezi

javascript系列正则表达式学习二位置匹配

文章首发于sau交流学习社区一、前言正则表达式是匹配模式,要么是匹配字符,要么匹配位置。 其实在开发中很少用到匹配位置,本篇文章主要包含: 二、什么是位置位置:相邻字符之间的位置。 三、如何匹配位置在ES5中,共有6个锚:^, $, b, B, (?=p), (?!p) 可视化形式: RegExp:/^$bB(?=a)(?!b)/g 3.1 ^和$^(脱字符)匹配开头,在多行匹配中匹配行开头。 $(美元符)匹配结尾,在多行匹配中匹配行结尾。 比如:我们把字符串的开头和结尾用#替换(位置可以替换成字符的): var result = "hello".replace(/^|$/g, '#');console.log(result);// "#hello#"多行匹配模式(有修饰符m)时,二者是行的概念,我们需要注意: var result = "I\nlove\njavascript".replace(/^|$/gm, '#');console.log(result);// #I#// #love#// #javascript#3.2 b和Bb是单词边界,具体就是w和W之间的位置,也包括w与^之间的位置,和w和$之间的位置。 比如考察文件名"[JS] Lesson_01.mp4"中的b,如下: var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#');console.log(result);// "[#JS#] #Lesson_01#.#mp4#"首先,我们知道w是字符组[0-9a-zA-Z]的简写,即使字母数字或者下划线中任何一个字符。而W是字符组1的简写,即W是w以外的任何一个字符。 我们再来看#是怎么来的: 第 1 个,两边字符是 "[" 与 "J",是 W 与 w 之间的位置。 第 2 个,两边字符是 "S" 与 "]",也就是 w 与 W 之间的位置。 第 3 个,两边字符是空格与 "L",也就是 W 与 w 之间的位置。 ...

May 15, 2019 · 2 min · jiezi

sublime正则搜索替换修改数据

手动挡经常会改不齐全,发现能写正则还是很方便的。 find> replace调出替换面板也可以快捷键 command+alt+F 这个引用到复杂点的数据里面 真的省事不要太多 方便不要太多 我知道得太迟了。。。。。。 mark一下 仅供参考 欢迎更正补充 end

May 14, 2019 · 1 min · jiezi

面试必背系列正则上

正则引言正则是一个前端必须掌握的知识。但是由于用的少,忘了记,记了忘,导致面试经常坐蜡。这里上篇先介绍正则的规则,下篇结合一些具体题目,带大家重新学习巩固一下正则,争取面试给自己加分。 简介介绍:用来处理字符串的一个规则正则:判断一个字符串是否符合我们的规则-> reg.test(str)捕获:把字符串中符合我们规矩的子字符捕获到 ->reg.exec(str) 规则生成正则的两种方式实例创建和使用字面量,但是要注意使用实例创建正式是可以使用变量进行拼接的 正则表达式由两种基本字符类型组成,原义文本字符和元字符 元字符:在正则表达式中具有特殊意义的字符,原义字符变元字符加''元字符分类边界类^ 开头 $ 结尾 b 单词边界 B非单词边界/\bengineer$/.test('I am an engineer') //true量词类*: 零次到多次 +:1次到多次?: 0次或者1次{n} 出现n次{n,m} 出现n次到m次 let reg = /1\d{10}$/ //验证手机号,第一位是1范围类[a-z] a-z之间的任何一个字符[a-zA-Z] a-z以及A-Z之间的任何一个字符'a1b2C3C4'.replace(/[a-z]/g,'Q') //"Q1Q2C3C4"字符类x|y :x或y中的一个[xyz]: x或者y或者z中的一个[^a-z] 除了a-z以外的任何一个字符[^xyz] 除了xyz以外的任何一个字符预定义类// . 除了回车和换行的所有字符 [^\r\n]// \d 数字 [0-9]// \s 空白字符 [\t\n\x0B\f\r]// \w 单词 字符[A-Za-z0-9_] //注意,.的范围要比\W范围大,因为它还包括制表符之类的`注意只是一个字符而不是一个单词`'hello'.replace(/\w{2}$/g,'x') //helx修饰符以及正则对象属性修饰符: i 忽略大小写g 全局匹配m 多行匹配注意这里设置了,在正则对象里的相应属性会改变var a = /\d/ga.global //truevar b = /\d/b.global //false正则对象属性: global ignore case multiline lastIndex sourse注意,lastindex在全局匹配里面会匹配一次改变一个,超出匹配范围会被清零var reg1 = /\w/var reg2 = /\w/greg1.test('a') //true //reg1.lastIndex //0reg1.test('a') //true //reg1.lastIndex //0reg1.test('a') //true //reg1.lastIndex //0reg2.test('a') //true //reg2.lastIndex //1reg2.test('a') //false //reg2.lastIndex //0reg2.test('a') //true //reg2.lastIndex //1reg2.test('a') //false //reg2.lastIndex //0贪婪模式和非贪婪模式正则默认是贪婪模式,会按尽可能多的匹配,在量词后面加?可以取消贪婪性 ...

May 14, 2019 · 1 min · jiezi

面试必背系列正则下

正则引言正则是一个前端必须掌握的知识。但是由于用的少,忘了记,记了忘,导致面试经常坐蜡。这里上篇先介绍正则的规则,下篇结合一些具体题目,带大家重新学习巩固一下正则,争取面试给自己加分。 面试题实战1. 匹配汉字let regx = /^[\u4e00-\u9fa5]{0,}$/2. 中国真实姓名 let reg = /^[\u4e00-\u9fa5]{2,4}$/3. 字符串去重把aaabbbccc变成abc思路1,转换成数组,利用set去重,再join思路2,正则(有局限性,必须是重复元素挨一起的,且不是这种镶嵌的'abac') let a = 'aabbbccc'let b = a.replace(/(\S)\1+/g,function (res) { //这里\1指的是第一个分组 return res[0]})console.log(b) //'abc'4.转驼峰var s1 = "get-element-by-id"; 给定这样一个连字符串,写一个function转换为驼峰命名法形式的字符串 getElementById let a = 'get-element-by-id' // 这个题目如果想分割单词是比较麻烦的 let f = function(s) { return s.replace(/-\w/g, function(x) { return x.slice(1).toUpperCase(); }) } console.log(f(a)) //getElementById5. 日期格式化2017-05-11转换成5/11/2017 let a = '2017-05-11'let reg = /(\d{4})-(\d{2})-(\d{2})/gb=a.replace(reg,function (res, g1, g2, g3) { return `${g2.slice(1)}/${g3}/${g1}`})console.log(b) //5/11/20176. JS实现千位分隔符 var a = '1234567' var reg = /\d{1,3}(?=(\d{3})+$)/g var b = a.replace(reg,function (res,group,index) { //如果有?的话分组指的是最后一个 console.log(res,group,index) //所以group永远是4,5,6 return res + ',' }) console.log(b) //1,234,5677. 获取 url 中的参数let url = 'www.baidu.com?age=11&name=fyy'let reg = /([^?&=]+)=([^?&=]+)/gvar obj = {}url.replace(reg,function(){ obj[arguments[1]] = obj[arguments[2]]})console.log(obj)8. 验证身份证号身份证号码可能为15位或18位,15位为全数字,18位中前17位为数字,最后一位为数字或者X ...

May 14, 2019 · 2 min · jiezi

可以用在-VS-Code-中的正则表达式小技巧

翻译:疯狂的技术宅https://medium.freecodecamp.o...本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 你是不是一直都想学正则表达式,但是因为它的复杂性而被推迟了?在本文中,我将向你展示五个易于学习的正则技巧,你可以立即在自己喜欢的文本编辑器中使用它们。 文本编辑器设置虽然现在几乎所有的文本编辑器都支持正则表达式,但我在本教程中用的是 Visual Studio Code,不过你可以使用任何你喜欢的编辑器。另请注意,你通常需要在搜索输入框附近的某处打开 RegEx 开关。以下是在 VS Code 中执行此操作的方法: 你需要通过选中此选项启用RegEx 1) . — 匹配任何字符让我们开始吧。点符号 . 用来匹配任何字符: b.t 上面的正则匹配 "bot",`"bat"和任何以b开头、t结尾的三个字符的单词。但是如果你想搜索点符号,则需要用 \ 来对它进行转义,所以下面这个正则只匹配确切的文本 "b.t": b\.t 2) .* — 匹配任何东西这里 . 表示“任何字符”, * 表示“此符号重复前面那个内容任何次数。” 把它们放在一起(.*)表示“任何符号重复任意次数。” 例如,你可以用它来查找以某些文本开头或结尾的匹配项。假设我们有一个这样的 javascript 方法: loadScript(scriptName: string, pathToFile: string)我们想找到这个方法的所有调用,其中 pathToFile 指向文件夹“lua” 中的任何文件。可以使用以下正则表达式: loadScript.*lua这意味着,“匹配所有以 "loadScript" 开始同时以"lua"结束的字符串。” 3) ? — 非贪婪的匹配.* 之后的 ? 符号和其他一些匹配规则意味着“尽可能少的匹配”。 在上一张图中,每次匹配都会得到两次 "lua"字符串,直到第二个 "lua" 所有东西才能全部匹配完毕。如果你想匹配第一次出现的"lua",可以使用以下正则: loadScript.*?lua这意味着,“匹配所有以 "loadScript"开头,后面为任意字符,直到第一次出现"lua" loadScript.*?lua:匹配以 loadScript 开头的所有内容,直到第一次出现"lua" ...

May 14, 2019 · 1 min · jiezi

使用Python正则表达式操作文本数据

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:7min 什么是正则表达式正则表达式,是简单地字符的序列,可指定特定的搜索模式。正则表达式已存在很长一段时间,并且它本身就是计算机科学的一个领域。 在 Python中,使用Python的内置re模块处理正则表达式操作 。在本节中,我将介绍创建正则表达式并使用它们的基础知识。您可以使用以下步骤实现正则表达式: 指定模式字符串。将模式字符串编译为正则表达式对象。使用正则表达式对象在字符串中搜索模式。可选:从字符串中提取匹配的模式。编写和使用正则表达式在Python中创建正则表达式的第一步是导入re 模块: import rePython正则表达式使用模式字符串表示,模式字符串是指定所需搜索模式的字符串。在最简单的形式中,模式字符串只能由字母,数字和空格组成。以下模式字符串表示精确字符序列的搜索查询。您可以将每个角色视为一个单独的模式。在后面的例子中,我将讨论更复杂的模式: import repattern_string = "this is the pattern"下一步是将模式字符串处理为Python可以使用的对象,以便搜索模式。这是使用re模块的compile()方法完成的。的编译()方法将图案字符串作为参数并返回一个正则表达式对象: import repattern_string = "this is the pattern" regex = re.compile(pattern_string)获得正则表达式对象后,可以使用它在搜索字符串中搜索模式字符串中指定的模式。搜索字符串只是您要在其中查找模式的字符串的名称。要搜索模式,可以使用regex对象的search()方法,如下所示: import repattern_string = "this is the pattern" regex = re.compile(pattern_string)match = regex.search("this is the pattern")如果模式字符串中指定的模式位于搜索字符串中,则search()方法将返回匹配对象。否则,它返回None数据类型,这是一个空值。 由于Python相当松散地解释了True和False值,因此搜索函数的结果可以像if语句中的布尔值一样使用,这可能相当方便: ....match = regex.search("this is the pattern") if match:print("this was a match!")这个模式应该产生一个匹配,因为它与模式字符串中指定的模式完全匹配。如果在搜索字符串的任意位置找到模式,搜索函数将生成匹配,如下所示: ...

May 13, 2019 · 2 min · jiezi

常用正则表达式收集-不断更新

写在前面:本篇文章用于收集常用的一些正则表达式,方便开发过程中快速查找。正则表达式逻辑分析工具:https://regexper.com空内容:/^\s*$/手机号:/^1((3\d)|(4[579])|(5([0-3]|[5-9]))|66|7(3|[5-8])|(8\d)|(9[89]))\d{8}$/微信号:/^[a-zA-Z0-9\-_]{6,20}$/

May 12, 2019 · 1 min · jiezi

PHP-正则表达式入门-Getting-Started-with-PHP-Regular-Expressions

原文链接: Getting Started with PHP Regular Expressions Last-Modified: 2019年5月10日16:23:19译者注: 本文是面向0正则基础的phper, 很多正则的高级使用都没有涉及到, 仅仅是一份简单的入门. 对于有基础的, 可直接查看本文末尾的正则表达式语法快速一览表(图) (不涉及修饰符) 译者追加 - 语法速览表 1. 什么是正则表达式正则表达式(regex 或 regexp)的主要目的在于有效地搜索给定文本中的模式. 这些搜索模式使用正则表达式解析器理解的特殊格式编写。 正则表达式源自Unix系统中一个名为grep的程序,该程序是用于帮助用户处理字符串和操作文本。 通过遵循一些基本规则,我们可以创建非常复杂的搜索模式。 例如,你被赋予一项任务: 检查电子邮件或电话号码是否具有正确的格式。通过使用一些简单的命令,这些问题可以通过正则表达式轻松解决。 正则语法初学时并不那么简单,但是一旦你学会了它,你就会意识到你可以轻松地进行复杂搜索,只需键入简短的字符就可以从不同的角度处理问题。 2. Perl兼容的正则表达式PHP已经实现了很多使用不同解析引擎的正则函数。PHP中主要有两个正则解析器,一个称为POSIX,另一个称为PCRE(Perl Compatible Regular Expression, Perl兼容正则表达式)。 POSIX的PHP函数前缀是 ereg_。自从PHP 5.3发布后,这个引擎已被弃用,但让我们来看看更优,更快的PCRE引擎。 在PHP中,每个PCRE函数都以 preg_ 开头,例如 preg_match 或 preg_replace。您可以阅读PHP文档中的完整功能列表。 3. 基础语法要使用正则表达式,你首先需要学习语法。该语法包含一系列字母,数字,点,连字符和特殊符号,我们可以使用不同的括号将它们组合在一起。 在PHP中,每个正则表达式模式都是使用符合 Perl 格式的字符串。在 Perl 中,在正斜杠之间写入正则表达式模式,例如 /hello/。在PHP中则是一个字符串 '/hello/'。 现在,让我们看看一些运算符,它们是正则表达式的基本构建块。 语法说明^^ 标志着模式的开始,尽管在某些情况下它可以省略&dollar;与 ^ 符号对应,$ 符号标志着搜索模式的结束.匹配任何单个字符?它将匹配前面的模式 0 或 1 次+它将匹配前面的模式 1 或 更多 次*它将匹配前面的模式 0 或 更多次\ 布尔 或–匹配范围内的元素()将不同的模式元素组合在一起[]匹配中括号之间的任何单个字符{min, max}它用于匹配确切的字符数d匹配任何单个数字D匹配任何单个非数字w匹配单词字符, 包括下划线 _W匹配任何非单词字符s匹配空白符作为PHP中的一个补充,使用简单的斜杠 \ 来转义正斜杠字符。示例:'/he\/llo/' ...

May 10, 2019 · 2 min · jiezi

比较实用高大上的正则表达式

匹配特殊字符集[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+ 必须且只能是字母+数字的组合长度6~25位/^(?![a-zA-Z]+$)(?![0-9]+$)[a-zA-Z0-9]{6,25}$/ 必须含有字母+数字的组合(还可以来些特殊字符)长度6~25位/^(?![a-zA-Z]+$)(?![0-9]+$)[a-zA-Z0-9\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]{6,25}$/ 必须含有字母+数字+特殊字符的组合长度6~25位/^(?![a-zA-Z0-9]+$)(?![a-zA-Z\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$)(?![0-9\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$)[a-zA-Z0-9\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]{6,25}$/ 正则语义解释(?![a-zA-Z]+$) 从当前位置到结尾不能是纯字母(?![0-9]+$) 从当前位置到结尾不能是纯数字(?![\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$) 从当前位置到结尾不能是纯特殊字符(?![a-zA-Z0-9]+$) 从当前位置到结尾不能只有字母和数字(?![a-zA-Z\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$) 从当前位置到结尾不能只有字母和特殊字符(?![0-9\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$) 从当前位置到结尾不能只有数字和特殊字符[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E] 键盘上的特殊字符集代码实例用 php 实例演示下,可以用来做密码复杂度的验证,比如必须得是数字+字母的组合,必须得有特殊字符等要求。 <?php// 必须是字母 数字的组合 不能有特殊字符$pattern_must_char_num = '/^(?![a-zA-Z]+$)(?![0-9]+$)[a-zA-Z0-9]{6,25}$/';// 不能是纯数字或纯字母 可以有特殊字符$pattern_should_char_num = '/^(?![a-zA-Z]+$)(?![0-9]+$)[a-zA-Z0-9\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]{6,25}$/';// 必须是字母 数字 特殊字符的组合$pattern_must_char_num_spechar = '/^(?![a-zA-Z0-9]+$)(?![a-zA-Z\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$)(?![0-9\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+$)[a-zA-Z0-9\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]{6,25}$/';$pure_num = '123456';$pure_char = 'asdqwe';$char_num = 'asd123';$char_num_spechar = '123@asd';/** * 校验数据是否达到 pattern 的级别 * @param [type] $standard_pattern [description] * @param [type] $subject [description] * @return [type] [description] */function complexityCheck(string $standard_pattern, string $subject): bool{ // 匹配次数 > 0 则符合 pattern return preg_match($standard_pattern, $subject) > 0;}var_dump(complexityCheck($pattern_must_char_num, $pure_num));var_dump(complexityCheck($pattern_must_char_num, $pure_char));var_dump(complexityCheck($pattern_must_char_num, $char_num));var_dump(complexityCheck($pattern_must_char_num, $char_num_spechar));echo str_repeat("=", 20) . PHP_EOL;var_dump(complexityCheck($pattern_should_char_num, $pure_num));var_dump(complexityCheck($pattern_should_char_num, $pure_char));var_dump(complexityCheck($pattern_should_char_num, $char_num));var_dump(complexityCheck($pattern_should_char_num, $char_num_spechar));echo str_repeat("=", 20) . PHP_EOL;var_dump(complexityCheck($pattern_must_char_num_spechar, $pure_num));var_dump(complexityCheck($pattern_must_char_num_spechar, $pure_char));var_dump(complexityCheck($pattern_must_char_num_spechar, $char_num));var_dump(complexityCheck($pattern_must_char_num_spechar, $char_num_spechar));完 ...

May 9, 2019 · 1 min · jiezi

前端培训初级阶段13-正则表达式

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 该文为前端培训-初级阶段(13、18)的补充内容 (介绍了 ECMAScript 历史,ES6 常用点)。 本文介绍ECMAScript基础知识。 前端培训-初级阶段(13) - ECMAScript (语法、变量、值、类型、运算符、语句)前端培训-初级阶段(13) - ECMAScript (内置对象、函数)前端培训-初级阶段(13) - 类、模块、继承基础内容知识我们会用到。默认已读。 我们要讲什么?正则表达式基本的关键词正则表达式一些进阶用法(预查断言)常见正则实战场景正则表达式基本的关键词声明一个正则表达式1)var reg=new RegExp('规则','条件'); 因为规则是一个字符串,所以可以拼接,比如new RegExp(['违规','骂人','涉黄','涉政'].join('|')).test('正经人涉黄')在这个场景当中,我们需要根据其他词库,来生成过滤正则。2)var reg=/规则/条件; 一般来说我们使用这个,方便快捷 条件 关键词说明用法iignore 忽略大小写一般用在标签匹配比如 <img>和<IMG>gglobal 全局一般用在需要匹配多个区域的时候比如违规词语要替换成**mmultiline 多行这个用的比较少规则里面的所有|都是错的,需要自己替换成半角的| 关键词匹配项 说明用法字符串常规字符 直接填入你要匹配的字符即可,关键词需要转义'骂人,骂人的话'.replace(/骂人/g, '**')\d数字0-9的缩写,也等价于[0-9]'0313-0000000'.replace(/\d/g, '*')\w单词,也等价于[a-zA-Z0-9_]'tel: 0313-;URI: lilnong.top'.replace(/\w/g, '*') \s任何不可见字符,包括空格、换行等。等价于[ \f\n\r\t\v]' \f\n\r\t\v'.replace(/\s/g, '*')\b单词边界,类似于$'lists list'.replace(/s\b/g, '')\D \W \S \B等同于上面小写的取反 \num匹配之前的分组num为索引,可以用来查找重复字符'abbcccddddeffffffff'.match(/(\w)\1+/g)( )分组 可以用来给\num匹配,也可以用来给match函数使用|或 用来标识关键字匹配其中的即可'x + y = ?'.replace(/x|y/g,()=>Math.random()*50>>0)[xyz]字符集合 比较常用里面可以放上面的关键词'x + y = ?'.replace(/[xy]/g,()=>Math.random()*50>>0).除“\n”和"\r"之外的任何单个字符。 上面介绍了常见的规则,其实还有一些匹配的量词 关键词匹配项 说明用法^标识开始'onchange'.match(/^on\w+/)$标识结束'abc.mp4.avi'.match(/\.\w+$/)*0或多个,等价于{0,}'abbccc'.match(/a*/g)+1或多个,等价于{1,}'abbccc'.match(/a+/g)?0活1个,等价于{0,1}'abbccc'.match(/a?/g){n,m}n和m可以省略一个,也可以都写上,限定个数 正则表达式一些进阶用法(预查)js中的支持的不是很好 将简单的网址:www.abc.com中的中间部分abc提取出来正向零宽先行断言 'https://segmentfault.com/write'.match(/\w+(?=\.com)/)3. ...

May 9, 2019 · 1 min · jiezi

正则表达式相关的API

与正则表达式相关的API有以下6个: RegExp.prototype.test()RegExp.prototype.exec()String.prototype.search()String.prototype.match()String.prototype.split()String.prototype.replace()在我们展开到各个方法之前,先来看一下在JavaScript里面定义一个正则表达式的两种方式:1:字面量 let reg = /\d[a-z]/ig;2:new一个RegExp()对象 let reg = new RegExp(/\d[a-z]/, 'ig');上面的2种方式定义的正则表达式,对于我们接下来要讲的6个方法都是适用的。一:RegExp.prototype.test()test()的参数是一个字符串,返回结果为布尔值。如果传入的字符串与正则表达式匹配,返回true,反之返回false。 let reg = new RegExp(/\d[a-z]/, 'ig');reg.test('1a'); // truereg.test('a1'); //false二:RegExp.prototype.exec() 三:String.prototype.search() 四:String.prototype.match() 五:String.prototype.split() 六:String.prototype.replace()

April 30, 2019 · 1 min · jiezi

正则表达式

[...]中括号在正则表达式里面也是一个非常常用的知识点,它的主要作用是设置一个集合和范围。 一:集合[abc]在正则表达式里表示一个包含a或者b或者c的集合,匹配三者之中的任意一个。注意元素之间不用空格和逗号隔开,因为在正则表达式里,[]里的空格或者逗号也会被判定为一个匹配元素。来看一个例子: let reg = /1[abc]2/g;'1a2'.match(reg); //["1a2"]'1b2'.match(reg); //["1b2"]上面的正则表达式需要匹配的是数字1和2之间为a,b,c三者中的任意一个。所以‘1a2’, '1b2'都可以匹配。再看下面一个例子: let reg = /1[abc]2/g;'1abc2'.match(reg); //null仍然是上面的正则表达式,但是‘1abc2’是不匹配的。这里要注意的一点就是[...]里面的元素,当只有出现其中的任意一个时才能匹配,可以理解为[...]里面的元素只占一个位置。我们这里的abc占了三个位置,是不匹配我们给出的正则的。 二:范围[1-9]表示数字1到9之间任意一个数字,[a-z]表示a到z之间的任意一个小写字母。在[]里用连字符(-)链接一个范围的两边,就能用来表示一个范围。 let reg = /[1-9][a-z]/g;'5d'.match(reg); //["5d"]'d1'.match(reg); // null三:集合和范围之外 [^]当我们在中括号里的元素前加上一个^,就表示匹配除此之外的元素。 [^abc] 除了'a','b', 'c'之外的任意字符 [^0-9] 除了数字之外的任意字符,等同于 \D [^\s] 除了空格之外的任意字符,等同于 \S看一个例子: let reg = /[^0-9a-z]/ig;'nana123@gmail.com'.match(reg); //["@", "."]这里我们需要匹配除了字母和数字之外的字符,所以我们匹配到了"@"和"."这两个字符。 四:[...]里的元字符我们知道元字符都有特色的含义与作用,比如".", "+", "?", "()"等,如果我们要把他们作为普通字母匹配,需要用""转义。例如,如果我们要匹配".", 需要用到"."。但是当他们出现在[]里面的时候,就失去了他们特色的作用,就做回了自己本身,也不需要再用后斜杠转义。 但是前面我们也讲到^出现在[]内部最前面,还有"-"出现在[a-z]这种情况下,还是有特殊意义的。那么当^不出现在[]内部最前面,还有"-"不出现在[a-z]这种情况下,他们也就是自己本身。例如: let reg = /[-().^+]/g;"1 + 2 - 3".match(reg); //["+", "-"]这里的"^"和"-"都只是字符本身,所以我们能匹配到["+", "-"]。当然如果在[]里面给这些元字符转义加上"",也不会有错,依然能匹配得到。

April 30, 2019 · 1 min · jiezi

正则表达式-捕获组

PS: 阅读此篇文章前需要具备以下知识: 正则表达式的基本语法String.prototype.replace()String.prototype.match()捕获组(capturing group)是正则表达式里比较常用,也是比较重要的概念,我个人觉得掌握这部分的知识是非常重要的。这篇文章内容不会很深入,但是尽量做到简单易懂又全面。接下来的内容主要是围绕以下7个点: 1: () 捕获组2: (?:) non capturing group3: (?=) positive lookahead4: (?!) negative lookahead5: (?<=) positive lookbehind6: (?<!) negative lookbehind7: (?=), (?!), (?<=), (?<!)的捕获 1: () 捕获组 /go+/以上的正则表达式表示一个字母g后面跟上一个或者多个字母o,他能匹配go或者goooo。但是如果我们想+不只是运用到字母o上,而是运用到go这个整体上怎么办呢?办法就是给go加括号: /(go)+/为了全局匹配以及不考虑大小写,我们接下来会给我们的正则加上ig,这两个flag: let reg = /(go)+/ig;'go is g gogo'.match(reg); //["go", "gogo"]在上面的例子里面(go)就形成了一个捕获组(capturing group)。接下来看一个使用捕获组的例子来加深对它的理解: let reg = /(\d{2}).(\d{2}).(\d{4})/;let originString = '10.25.2017';reg.test(originString); //trueRegExp.$1; //10RegExp.$2; //25RegExp.$2; //2017在上面这个例子里,我们有三组括号,形成了三个捕获组,正则表达式(在javaScript里就是我们的RegExp)会缓存捕获组所匹配的串,以$n表示,n就代表这第几个捕获组。 假如现在我们有一个需求:把显示格式为 10.25.2017 的时间改为 2017-10-25 格式。 我们知道String的replace()方法经常和正则表达式一起使用。在replace()方法里,我们可以直接使用捕获组的结果: let reg = /(\d{2}).(\d{2}).(\d{4})/;let originString = '10.25.2017';let newString = originString.replace(reg, '$3-$1-$2');console.log(newString);//"2017-10-25"2: (?:) non capturing group 非捕获型分组有的时候我们可能只想匹配分组,但是并不想缓存(不想捕获)匹配到的结果,就可以在我们的分组模式前面加上?:。例如上面的时间的例子,我们不想捕获第一个分组的结果,就可以这么做: ...

April 29, 2019 · 2 min · jiezi

JS-正则备忘单

正则表达式或“regex”用于匹配字符串的各个部分 下面是我创建正则表达式的备忘单。 匹配正则使用 .test() 方法 let testString = "My test string";let testRegex = /string/;testRegex.test(testString);匹配多个模式使用操作符号 | const regex = /yes|no|maybe/; 忽略大小写使用i标志表示忽略大小写 const caseInsensitiveRegex = /ignore case/i;const testString = 'We use the i flag to iGnOrE CasE';caseInsensitiveRegex.test(testString); // true提取变量的第一个匹配项使用 .match() 方法 const match = "Hello World!".match(/hello/i); // "Hello"提取数组中的所有匹配项使用 g 标志 const testString = "Repeat repeat rePeAT";const regexWithAllMatches = /Repeat/gi;testString.match(regexWithAllMatches); // ["Repeat", "repeat", "rePeAT"] 匹配任意字符使用通配符. 作为任何字符的占位符 // To match "cat", "BAT", "fAT", "mat"const regexWithWildcard = /.at/gi;const testString = "cat BAT cupcake fAT mat dog";const allMatchingWords = testString.match(regexWithWildcard); // ["cat", "BAT", "fAT", "mat"] 用多种可能性匹配单个字符使用字符类,你可以使用它来定义要匹配的一组字符把它们放在方括号里 []//匹配 "cat" "fat" and "mat" 但不匹配 "bat"const regexWithCharClass = /[cfm]at/g;const testString = "cat fat bat mat";const allMatchingWords = testString.match(regexWithCharClass); // ["cat", "fat", "mat"] 匹配字母表中的字母使用字符集内的范围 [a-z] ...

April 29, 2019 · 3 min · jiezi

关于正则表达式的一些笔记整理

基础知识一 元字符 \b 单词分界空格\d 数字 [0-9]\w 英文 数字 下划线 [a-z0-9_]\s 空白字符反义\D [^0-9]\W [^a-z0-9_]\S 非空白字符. 任意字符 少用.* 任意数量的不包含换行的字符 贪婪匹配.? 懒惰 非贪婪匹配\u4e00-\u9fa5 中文二 量词 三 集合 字符类 [abc] 匹配a/b/c任意字符 [^abc] 匹配除了abc外的任意字符 [a-z] 匹配a到z任意字符 //注意:里面的-代表的是范围 例如'ahd-fj-k'.replace(/[a-z]/g,'A') //输出 》AAA-AA-A//如果我想把斜杠也替换了呢 有两个方法 1. 利用转义符\ 'ahd-fj-k'.replace(/[a-z\-]/g,'B') //输出BBBBBBBB 2. 后面加多一个- 'ahd-fj-k'.replace(/[a-z\-]/g,'B') //输出BBBBBBBB//() 在集合里面默认被转义了 like this //'(122)do('.replace(/[(\d)]/g,'A') 输出 AAAAAdoA //具体被转义范围不确定 欢迎普及补充 四 分支 123|34|567 //匹配123或34或567五 边界 开始结束 ^ //代表开始 在[]代表非$ //代表结束六 修饰符 g //全局匹配 不写的话匹配完第一个就停止i //忽略大小写m //忽略换行//上面3可叠加使用七 贪婪模式和非贪婪模式js默认贪婪模式 即最大可能的匹配想要改成非贪婪模式在后面加个? ...

April 22, 2019 · 2 min · jiezi

匹配手机号码及运营商校验

最新手机号正则,(无法保证时效性,注意 及时更新)移动:134、135、136、137、138、139、147、148、 150、151、152、157、158、159、172、178、182、183、184、187、188、198,联通:130、131、132、145、146、155、156、166、171、175、176、185、186,电信:133、149、153、173、174、177、180、181、189、199,全球星:1349,虚拟运营商电信:1700、1701、1702移动:1703、1705、1706联通:1704、1707、1708、1709匹配手机号码的正则表达式:^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,1,3,5-8])|(18[0-9])|166|198|199|(147))\d{8}$^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$ 区分运营商(摘自:原文:https://blog.csdn.net/qq_3571… )//移动:134(0 - 8) 、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188、198 //联通:130、131、132、145、155、156、175、176、185、186、166//电信:133、153、173、177、180、181、189、199 /^((134)|(135)|(136)|(137)|(138)|(139)|(147)|(150)|(151)|(152)|(157)|(158)|(159)|(178)|(182)|(183)|(184)|(187)|(188)|(198))\d{8}$/g;/^((130)|(131)|(132)|(155)|(156)|(145)|(185)|(186)|(176)|(175)|(170)|(171)|(166))\d{8}$/g;/^((133)|(153)|(173)|(177)|(180)|(181)|(189)|(199))\d{8}$/g;简写:/^((13[456789])|(147)|(15[012589])|(178)|(18[2348])|(198))\d{8}$/g;/^((13[012])|(145])|(15[56])|(166])|(17[0156])|(18[56]))\d{8}$/g;/^((133)|(153)|(17[37])|(18[019])|(199))\d{8}$/g;

April 18, 2019 · 1 min · jiezi

靓号检测

靓号检测:(无法保证时效性,注意 及时更新)主要可以检测连号(正连 12345、倒连65432)、AABB号、手机号码、日期号(生日号、年度号)、ABBCABB号,3位以上重复号。更多类型号码检测可以根据以下表达式改造。匹配6位顺增 regex.Pattern = “(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){5}d"匹配3位以上顺增 regex.Pattern = “(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){3,}+d匹配6位顺降 regex.Pattern = “(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){5}d"匹配6位顺增或顺降 regex.Pattern = “(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){5}|(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){5})d"匹配4-9位连续的数字 (?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){3,}|(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){3,})d匹配3位以上的重复数字 ([d])1{2,}匹配日期类型的数字 (19|20)[d]{2}(1[0-2]|0?[1-9])(31|2[0-9]|1[0-9]|0?[0-9])手机号码类 (13[0-9]|15[0-9]|18[0-9])([d]{2,4}){2}匹配33111类型的 ([d])1{1,}([d])2{2,}匹配5331533类型的 (([d]){1,}([d]){1,})1{1,}匹配22334,123355类型的 ([d])1{1,}([d])2{1,}部分摘自 https://segmentfault.com/q/1010000018046739?utm_source=tag-newest https://www.cnblogs.com/hdl217/p/3503409.html

April 18, 2019 · 1 min · jiezi

php 验证 手机号码

最近公司让我将身份证校验改为严格校验,刚开始我使用了网上找到的身份证正则校验进行校验:/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/但是,老板说这个校验没有进行严格的身份证校验,这个校验只校验了身份证的格式是否正确,无法判断身份证号码格式是否正确下面为严格校验身份证号码的校验方法:/** * function: checkNum * author: wangjian * date: 2019/4/16 15:21 * 检测身份证号是否正确 */ function checkNum($num_id) { $num_id = strtoupper($num_id); $regx = “/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/”; $arr_split = array(); if(!preg_match($regx, $num_id)) { return FALSE;//正则校验 } if(15==strlen($num_id)) //检查15位 { $regx = “/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/”; @preg_match($regx, $num_id, $arr_split); //检查生日日期是否正确 $dtm_birth = “19”.$arr_split[2] . ‘/’ . $arr_split[3]. ‘/’ .$arr_split[4]; if(!strtotime($dtm_birth)) { return FALSE; } else { return TRUE; } } else //检查18位 { $regx = “/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/”; @preg_match($regx, $num_id, $arr_split); $dtm_birth = $arr_split[2] . ‘/’ . $arr_split[3]. ‘/’ .$arr_split[4]; if(!strtotime($dtm_birth)) //检查生日日期是否正确 { return FALSE; } else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); $arr_ch = array(‘1’, ‘0’, ‘X’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’); $sign = 0; for ( $i = 0; $i < 17; $i++ ) { $b = (int) $num_id{$i}; $w = $arr_int[$i]; $sign += $b * $w; } $n = $sign % 11; $val_num = $arr_ch[$n]; if ($val_num != substr($num_id,17, 1)) { return FALSE; } else { return TRUE; } } } }如果你只需要简单的校验身份证号码的话,你只需要使用我上面的正则规则进行校验即可,如果需要严格校验的话,可以使用我上面的验证方法来进行校验 ...

April 16, 2019 · 1 min · jiezi

从vue模板解析学习正则表达式

前言最近在看vue的模板解析成render这一块,顺便补一下正则的知识文件地址srccompilerparserhtml-parser.js1. attributeconst attribute = /^\s*([^\s"’<>/=]+)(?:\s*(=)\s*(?:"([^"])"+|’([^’])’+|([^\s"’=<>]+)))?/这段正则很长,他的主要作用是匹配标签里的指令,可以分几个分组来解读^\s* ^ 从起始位置开始匹配 \s 空白字符 * 匹配前面的子表达式零到多次 ----&gt; 匹配空白字符,匹配指令名前面的空白符([^\s"'&lt;&gt;\/=]+) [^xyz] 反向字符集 + 匹配前面的子表达式一到多次 ---&gt; 匹配指令名 例: aaa= ----&gt; aaa aaa/ ---&gt; aaa(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=&lt;&gt;]+)))?? 匹配前面的子表达式零到一次。 —> 这个表达式最后有个?,意思就是这个可以不匹配,像是一些属性是boolean的标签"([^"])"+ —> 匹配双引号, 且中间有值 例: name=“aaa”’([^’])’+—> 匹配单引号, 且中间有值 例: name=‘aaa’([^\s"’=<>]+---&gt; 匹配不跟引号的情况 例: name=aaaa\s*(=)\s*---&gt; 去掉=左右的空白字符2. ncnameconst ncname = '[a-zA-Z_][\\w\\-\\.]*' \w 查找单词字符。单词字符包括:a-z、A-Z、0-9,以及下划线。 ---&gt; 用于识别合法的xml标签 匹配第一个字是[a-zA-Z_], 之后是\w的情况3. qnameCaptureconst qnameCapture = ((?:${ncname}\:)?${ncname})---&gt; 匹配aaa:aaa的情况4. startTagOpenconst startTagOpen = new RegExp(^<${qnameCapture})---&gt; 匹配开始标签 &lt;aaaaa&gt;的话会匹配到 &lt;aaaaa5. startTagCloseconst startTagClose = /^\s*(\/?)&gt;/---&gt; 匹配结束标签 先是任意数量的空白字符,然后是 /&gt;6. endTag const endTag = new RegExp(^<\/${qnameCapture}[^>]*>`) —> 匹配结束标签 注意的一点是 这里</aaa 我>也能通过,但是这样的数据在loader哪里已经报错了7. doctype const doctype = /^<!DOCTYPE [^>]+>/i —> 匹配<!DOCTYPE> 声明标签总结 补了不少正则的知识点,至少基本的正则能写了,能看一些不是特别复杂的正则 ...

April 4, 2019 · 1 min · jiezi

python模块之re(正则表达式)

匹配模式re.ASCII同re.A,对应的内联标识为(?a),用于向后兼容。使元字符\w, \W, \b, \B, \d, \D, \s和\S仅匹配ASCII字符。该模式只在string模式下有意义,在byte模式下将被忽略。re.DEBUG显示debug信息,没有对应的内联标识。re.IGNORECASE同re.I,对应的内联标识是(?i)。忽略大小写匹配,如表达式[A-Z]也会匹配小写的字母a-z。对Unicode字符同样生效(如’Ü’可以匹配’ü’),除非指定了re.ASCII禁止匹配非ASCII字符。当前locale不会改变此标识的效果,除非指定了re.LOCALE。在string模式下[a-z],[A-Z]和IGNORECASE标识结合使用时,将匹配52个ASCII字母和4个非ASCII字母。re.LOCALE同re.L,对应的内联标识为(?L)。不推荐使用。re.MULTILINE同re.M,对应的内联标识为(?m)。多行模式,改变元字符^和$的行为。默认^只匹配字符串开始,指定后还会匹配每行的开始(换行符之后);默认$只匹配字符串结尾,指定后还会匹配每行结尾(换行符之前)。re.DOTALL同re.S,对应的内联标识为(?s)。此模式下,元字符.匹配任意字符,包括换行符。re.VERBOSE同re.X,对应的内联标识为(?x)。冗余模式,此模式下可以在表达式中添加注释,使其更具可读性,但在编译时会忽略多余的空格和注释。模块级方法re.compile(pattern, flags=0)编译正则表达式pattern,返回一个SRE_Pattern对象。flags参数指定匹配模式。re.search(pattern, string, flags=0)扫描string参数,查找正则表达式pattern产生匹配的第一个结果,返回一个SRE_Match对象。如果返回None表示匹配失败re.match(pattern, string, flags=0)如果string参数开头的0个或多个字符匹配正则表达式pattern,返回一个SRE_Match对象。如果返回None表示匹配失败即使在MULTILINE模式下,match()函数也只会匹配字符串开头,而不会匹配每行开头re.fullmatch(pattern, string, flags=0)如果string参数整个匹配正则表达式pattern,返回一个SRE_Match对象。如果返回None表示匹配失败。re.split(pattern, string, maxsplit=0, flags=0)正则表达式pattern作为分隔符拆分string参数,返回拆分后的列表。maxsplit如果不为0,最多拆分maxsplit次,string参数的余下部分将作为列表的最后一个元素返回。如果在pattern中使用了分组(…),返回列表中还会包含所有匹配的分组本身。>>> re.split(r’\W+’, ‘Words, words, words.’)[‘Words’, ‘words’, ‘words’, ‘’]>>> re.split(r’(\W+)’, ‘Words, words, words.’)[‘Words’, ‘, ‘, ‘words’, ‘, ‘, ‘words’, ‘.’, ‘’]>>> re.split(r’\W+’, ‘Words, words, words.’, 1)[‘Words’, ‘words, words.’]>>> re.split(’[a-f]+’, ‘0a3B9’, flags=re.IGNORECASE)[‘0’, ‘3’, ‘9’]如果pattern在字符串的开头匹配,那么返回列表第一个元素是空字符串;同样地,如果pattern在字符串末尾匹配,返回列表的最后一个元素是空字符串:>>> re.split(r’(\W+)’, ‘…words, words…’)[’’, ‘…’, ‘words’, ‘, ‘, ‘words’, ‘…’, ‘’]re.findall(pattern, string, flags=0)返回一个列表,按顺序排列所有成功的分组匹配。如果pattern参数中只有一个分组,列表元素为所有成功的分组匹配;如果存在超过一个以上的分组,列表元素为元组形式的各个分组匹配。如果返回空列表表示匹配失败>>> content = ‘333STR1666STR299’>>> regex = r’([A-Z]+(\d))’>>> re.findall(regex, content)[(‘STR1’, ‘1’), (‘STR2’, ‘2’)]>>> regex1 = r’[A-Z]+(\d)’>>> re.findall(regex1, content)[‘1’, ‘2’]# 如果正则表达式不含分组,视其整体为一个分组>>> regex2 = r’[A-Z]+\d’>>> re.findall(regex2, content)[‘STR1’, ‘STR2’]>>> regex3 = r’([A-Z]+\d)’>>> re.findall(regex3, content)[‘STR1’, ‘STR2’]re.finditer(pattern, string, flags=0)查找所有匹配成功的字符串, 返回一个迭代器,元素为SRE_Match对象。如果返回空迭代器表示匹配失败content = ‘333STR1666STR299’regex = r’([A-Z]+(\d))‘result = re.finditer(regex, content)for i in result: print(i.group(0))# STR1# STR2re.sub(pattern, repl, string, count=0, flags=0)使用pattern匹配原始字符串string,将匹配到的结果用repl替换,返回一个新的字符串。如果没有匹配返回原字符串。count是一个正整数,表示字符串替换的最大次数。repl可以是字符串或函数,如果是字符串,其中的的所有\都将进行转义处理,比如\n表示换行符,反向引用\6表示pattern匹配的第六个分组,而某些无意义的转义可能原样保留或导致异常:>>> re.sub(r’def\s+([a-zA-Z_][a-zA-Z_0-9])\s(\s*):’,… r’static PyObject*\npy_\1(void)\n{’,… ‘def myfunc():’)‘static PyObject*\npy_myfunc(void)\n{‘如果repl是函数,该函数接收单个SRE_Match对象为参数,pattern匹配到一次结果便会调用一次该函数,返回要替换的字符串:>>> def dashrepl(matchobj):… if matchobj.group(0) == ‘-’: return ’ ‘… else: return ‘-’>>> re.sub(’-{1,2}’, dashrepl, ‘pro—-gram-files’)‘pro–gram files’>>> re.sub(r’\sAND\s’, ’ & ‘, ‘Baked Beans And Spam’, flags=re.IGNORECASE)‘Baked Beans & Spam’re.subn(pattern, repl, string, count=0, flags=0)同sub(),但返回值为(new_string, number_of_subs_made)re.escape(pattern)转义特殊字符。re.purge()清空正则表达式缓存。异常exception re.error(msg, pattern=None, pos=None)属性msg:未格式化的错误信息pattern:正则表达式pos:导致异常的pattern索引位置,可能为Nonelineno:pos在第几行,可能为Nonecolno:pos在所在行的位置,可能为NonePattern对象方法Pattern.search(string[, pos[, endpos]])与模块级的search()类似。pos和endpos表示string参数的前endpos个字符中,从索引为pos的位置开始匹配,如果endpos小于等于pos,返回NonePattern.match(string[, pos[, endpos]])与模块级的match()类似。pos和endpos参数意义同search()>>> pattern = re.compile(“o”)>>> pattern.match(“dog”) # No match as “o” is not at the start of “dog”.>>> pattern.match(“dog”, 1) # Match as “o” is the 2nd character of “dog”.<re.Match object; span=(1, 2), match=‘o’>Pattern.fullmatch(string[, pos[, endpos]])与模块级的fullmatch()类似。pos和endpos参数意义同search()>>> pattern = re.compile(“o[gh]”)>>> pattern.fullmatch(“dog”) # No match as “o” is not at the start of “dog”.>>> pattern.fullmatch(“ogre”) # No match as not the full string matches.>>> pattern.fullmatch(“doggie”, 1, 3) # Matches within given limits.<re.Match object; span=(1, 3), match=‘og’>Pattern.split(string, maxsplit=0)与模块级的split()相同Pattern.findall(string[, pos[, endpos]])与模块级的findall()类似。pos和endpos参数意义同search()Pattern.finditer(string[, pos[, endpos]])与模块级的finditer()类似。pos和endpos参数意义同search()Pattern.sub(repl, string, count=0)与模块级的sub()相同Pattern.subn(repl, string, count=0)与模块级的subn()相同属性Pattern.flags:返回一个正整数,表示正则匹配模式。该值是compile()函数中pattern参数中的内联标识以及flags参数指定的模式,和隐式的re.UNICODE(如果pattern为Unicode字符串)的值的和>>> re.UNICODE<RegexFlag.UNICODE: 32>>>> re.IGNORECASE<RegexFlag.IGNORECASE: 2># 32 + 2>>> re.compile("", flags=re.IGNORECASE).flags34Pattern.groups:pattern中存在的分组数量Pattern.groupindex:正则表达式中所有命名分组名称和对应分组号的映射;如果没有使用命名分组,返回一个空字典>>> pattern = re.compile(r"(?P<first_name>\w+) (?P<last_name>\w+)")>>> pattern.groupindexmappingproxy({‘first_name’: 1, ’last_name’: 2})Pattern.pattern:编译pattern对象的正则表达式Match对象方法Match.expand(template)通过对template中的反斜杠引用进行替换,返回替换后的字符串。例如\n将转义为换行符,\1, \g<name>将替换为Match对象中对应的分组:>>> m = re.search("(b)+(z)?", “cba”)>>> m<re.Match object; span=(1, 2), match=‘b’>>>> m.expand(r’ab\1’)‘abb’>>> m.expand(r’ab\2’)‘ab’>>> print(m.expand(r’ab\n’))ab>>>Match.group([group1, …])返回Match对象的一个或多个子分组。如果传入单个参数,返回单个字符串;如果传入多个参数,返回一个元组,元组中的每个元素代表每个参数对应的分组。如果参数为0,返回值为pattern匹配的完整字符串如果参数在1-99范围内,返回对应分组匹配的字符串如果参数为负数或大于pattern中定义的分组数量,抛出IndexError异常如果对应分组无匹配,返回None如果一个分组匹配多次,只返回最后一次匹配的结果>>> m = re.match(r"(\w+) (\w+)(\d+)?", “Isaac Newton, physicist”)>>> m.group(0) # (1)‘Isaac Newton>>> m.group(1) # (2)‘Isaac’>>> m.group(2) # (2)‘Newton’>>> m.group(1, 2) # Multiple arguments give us a tuple.(‘Isaac’, ‘Newton’)>>> type(m.group(3)) # (4)<class ‘NoneType’>>>> m = re.match(r"(..)+", “a1b2c3”) # Matches 3 times.>>> m.group(1) # (5)‘c3’如果正则表达式中使用了(?P<name>…),group()也支持通过分组名的方式访问分组,分组名不存在将抛出IndexError异常:>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", “Malcolm Reynolds”)>>> m.group(‘first_name’)‘Malcolm’>>> m.group(’last_name’)‘Reynolds’# 仍然可以通过索引访问>>> m.group(1)‘Malcolm’>>> m.group(2)‘Reynolds’Match.getitem(g)等同于group(),提供了更简单的访问分组的方式:>>> m = re.match(r"(\w+) (\w+)", “Isaac Newton, physicist”)>>> m[0] # The entire match’Isaac Newton’>>> m[1] # The first parenthesized subgroup.‘Isaac’>>> m[2] # The second parenthesized subgroup.‘Newton’>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", “Malcolm Reynolds”)>>> m[“first_name”]‘Malcolm’Match.groups(default=None)返回一个包含所有子分组的元组,元组长度等同于pattern中的分组数量;如果没有分组,返回空元组。default参数作为分组无匹配值时的默认值,默认为None:>>> m = re.match(r"(\d+).(\d+)", “24.1632”)>>> m.groups()(‘24’, ‘1632’)>>> m = re.match(r"(\d+).?(\d+)?", “24”)>>> m.groups() # Second group defaults to None.(‘24’, None)>>> m.groups(‘0’) # Now, the second group defaults to ‘0’.(‘24’, ‘0’)Match.groupdict(default=None)返回一个字典,key为pattern中定义的分组名称,value为分组的匹配值;如果没有使用命名元组,返回空字典。default参数作为分组无匹配值时的默认值,默认为None:>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", “Malcolm Reynolds”)>>> m.groupdict(){‘first_name’: ‘Malcolm’, ’last_name’: ‘Reynolds’}Match.start([group])Match.end([group])返回由group匹配的子字符串在原始字符串中的开始和结束索引。group默认为0,表示完整匹配结果。如果返回-1,表示group存在但没有匹配值如果m.start(group)等同于m.end(group),表示group匹配一个空字符串>>> m = re.match(r"(\w+) (\w+)(\d)?", “Isaac Newton, physicist”)>>> m<re.Match object; span=(0, 12), match=‘Isaac Newton’># (1)>>> m.start()0>>> m.end()12# (2)>>> type(m[3])<class ‘NoneType’>>>> m.start(3)-1>>> m.end(3)-1# (3)>>> m[3]’’>>> m.start(3)12>>> m.end(3)12Match.span([group])返回(m.start(group), m.end(group))形式的元组,如果group不存在对应匹配值,返回(-1, -1)。group默认为0,表示完整匹配结果属性Match.pos:传递给Pattern对象的search(), match(), fullmatch()方法的pos参数Match.endpos:传递给Pattern对象的search(), match(), fullmatch()方法的endpos参数Match.lastindex:具有匹配值的最后一个分组的位置,如果没有任何分组匹配,返回None。>>> m = re.search(r"a(z)?", “ab”)>>> type(m.lastindex)<class ‘NoneType’>>>> m = re.match(r"(\w+) (\w+)(\d)?", “Isaac Newton, physicist”)>>> m.lastindex2Match.lastgroup:具有匹配值的最后一个分组的名称,如果没有命名分组或没有任何分组匹配,返回NoneMatch.re:创建当前Match对象的Pattern对象Match.string:进行匹配的原始字符串3.7版本re模块新特性Non-empty matches can now start just after a previous empty match:# python3.7之前>>> re.sub(‘x*’, ‘-’, ‘abxd’)’-a-b-d-’# python3.7>>> re.sub(‘x*’, ‘-’, ‘abxd’)’-a-b–d-‘Unknown escapes in repl consisting of ’’ and an ASCII letter now are errors:# python3.7之前>>> print(re.sub(r’\w+’, r’\d’, ‘ab&xd&’))\d&\d&# python3.7>>> print(re.sub(r’\w+’, r’\d’, ‘ab&xd&’))…re.error: bad escape \d at position 0Only characters that can have special meaning in a regular expression are escaped:# python3.7之前>>> print(re.escape("!#$%&"))!#$%&amp;# python3.7>>> print(re.escape("!#$%&"))!#$%&amp;Added support of splitting on a pattern that could match an empty string:# python3.7之前>>> re.split(r’\b’, ‘Words, words, words.’)…ValueError: split() requires a non-empty pattern match.>>> re.split(r’\W*’, ‘…words…’)[’’, ‘words’, ‘’]>>> re.split(r’(\W*)’, ‘…words…’)[’’, ‘…’, ‘words’, ‘…’, ‘’]# python3.7>>> re.split(r’\b’, ‘Words, words, words.’)[’’, ‘Words’, ‘, ‘, ‘words’, ‘, ‘, ‘words’, ‘.’]>>> re.split(r’\W*’, ‘…words…’)[’’, ‘’, ‘w’, ‘o’, ‘r’, ’d’, ’s’, ‘’, ‘’]>>> re.split(r’(\W*)’, ‘…words…’)[’’, ‘…’, ‘’, ‘’, ‘w’, ‘’, ‘o’, ‘’, ‘r’, ‘’, ’d’, ‘’, ’s’, ‘…’, ‘’, ‘’, ‘’]Added support of copy.copy() and copy.deepcopy(). Match objects are considered atomic ...

April 2, 2019 · 3 min · jiezi