关于regexp:教你excel表格怎么提取手机号码和姓名

在办公职场中,常常遇到问题:excel表格怎么提取手机号码和姓名?借助软件,金芝号码提取整顿助手,你能够栢渡搜一下它的名字。它能够解决题目中的问题,软件的作者徽veve188。在关上一个excel表格,外面含有手机号码和姓名时,从网上导出的excel通常姓名和电话放在同一个单元格须要重新处理:把单元格内姓名和电话号码提取进去。如果要批量整顿他们,通过人工一个一个输出复制粘贴不仅费时费力,而且也很容易呈现过错,那么借助业余的工具,金芝号码提取整顿助手,就能够轻松解决。 关上你的excel表格,常见的格局是,右边是公司,两头是名字,后左边是含有手机号码的芜杂文本(手机号码、固话、汉字、字母等混合)。咱们的目标是名字和手机号码一一对应提取下来。 第一步:咱们必须严格把资料整顿成咱们规定的格局:放在excel表格外面,成为两列相邻,右边一列是名字,左边是含有手机号码芜杂文本的一列,必须肯定要是这个格局,见下图。 第二步:你用鼠标点一下这两列文本,把两列文本全副复制好(技巧:鼠标点击所在列的头部字母而后往右拉,可全选两列,而后鼠标右击,复制)。 第三步:关上软件,“金芝号码提取整顿助手”,选第二个性能“对应名字提取”,把方才复制好的文本,鼠标右击点“粘贴”到软件上。 第四步:点“提取手机号”,就能看到提取后果展现在软件上,名字在右边一列,手机号码在左边一列,两头有个空格离开,排的洁净参差。坐等提醒你“提取实现”,而后点“导出excel”即可,整顿好的就是下图的成果。 此外,如果想把公司名字,人名,手机号码,三列都整顿下来的话,跟下面的操作方法一样,把人名这一列删除,这样的话公司名字和手机号码两列凑近相邻,两列,再次提取,就会失去的公司名字和手机号码。 再把后面提取好的名字,复制过去,插在公司名字和手机号码两头即可,整顿成为三列,很简略的操作,做成的成果见下图。 想进步工作效率,正当的形式便是找到适合的工具软件,金芝号码提取整顿助手,来帮忙咱们解决遇到的问题,能力疾速把艰难解决,我么能够把更多贵重的工夫拿去做比它更重要的事件,这样能力更洼地进步工作效率,也能失去更好地工作成果,失去称心的工作播种。

November 2, 2021 · 1 min · jiezi

关于regexp:javascript高级4

正则表达式正则表达式是一个对象,次要是用于匹配字符串中字符组合的模式。特点 可过滤页面内容的一些敏感词从字符串获取咱们想要的特定局部。创立正则表达式在javascript中,能够通过两种形式创立正则表达式test()是正则表达式对象的办法,用来测验字符串是否合乎该规定,返回值为true或者false.留神:正则表达式不须要加引号,不论是字符串或值型 1.通过RegExp对象的形式创立正则表达式 var 变量名 = new RegExp(/表达式/)2.通过字面量创立 var 变量名 = /表达式/正文两头放表达式就是正则表达式字面量 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>正则表达式</title></head><body></body><script> //1.利用RegExp对象来创立正则表达式 let regexp = new RegExp(/123/); console.log(regexp) //2.利用字面量的形式来创立 let regexp2 = /123/; console.log(regexp2) //test()办法用来测验字符串参数是否合乎正则表达式的规定 console.log(regexp.test(123)); console.log(regexp2.test(123));</script></html> ### 正则表达式的组成 一个正则表达式能够由简略的字符组成,比方/abc/,也能够是简略与特殊字符的组合,如 ^ 、$ 、+ 等。 特殊字符十分多,能够参考: MDN:https://developer.mozilla.org...jQuery 手册:正则表达式局部正则测试工具: http://tool.oschina.net/regex特殊字符也别称为元字符边界符正则表达式中的边界符(地位符)用来提醒字符所在的地位,次要有两个字符 如果^与$同时存在,则代表精准匹配 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>正则表达式之边界符</title></head><body></body><script> let regexp = /abc/; //test()办法外面的参数只有蕴含abc字符,即为true console.log(regexp.test('abc'))//true console.log(regexp.test('abcd'))//true console.log(regexp.test('abcde'))//true let regexp2 = /^abc/ //test()办法外面的参数必须以abc结尾,即为true console.log(regexp.test('abc'))//true console.log(regexp.test('bacd'))//false console.log(regexp.test('abcde'))//true let regexp3 = /^abc$/ //test()办法外面的参数必须是abc,即为true console.log(regexp.test('abc'))//true console.log(regexp.test('bacd'))//false</script></html> ...

September 19, 2020 · 1 min · jiezi

正则表达式的深入理解

为了更好的理解正则表达式,我们需要思考几个问题。 我们要匹配确切的内容。我们要匹配类型的内容,包括同类(数字,字母)和次数。我们要匹配的相关内容,同时在位置(这个概念很重要)上要有要求。比如它的前面不能是什么,后面不能是什么。针对这三类问题:正则表达式提供相应的语法。 第一类问题:比较简单,我们直接写我们想要的值就可以了,也是用的最多的。比如: /l/, /ge/ /hello/第二类问题:这个情况就比较多,例如,匹配数组,匹配大写,匹配多个字符。针对这个提供一系列的语法:比如:/d, /w, [a-z], [0-9], ., +, *......第三类问题:这个情况其实相对简单写,毕竟位置就那么几种(开头,结尾,前,后)。正则也提供了语法:比如:^, $, \b, \B, (?=), (?!), (?<=), (?<!)针对其语法,我们还需要知道一样东西:什么语法匹配字符位,什么语法匹配位置,因为正则毕竟是匹配字符串的。所以每一个正则表达式出来一定要知道他会匹配出几个字符。第一类和第二类的语法都是匹配字符位的,第三类语法都是匹配位置,不占字符位。 在把语法的分类了解清楚了,下面我们就需要了解正则的匹配执行的流程,这个对理解正则非常重要。我跟据我的理解,希望能够让读者简单的理解下。以一个例子开头吧: var str="tfabCWa5684ab";var reg=/ab/g;console.log(str.match(reg));正则的匹配过程:首先由正则表达式的字符"a"获取控制权,从位置0处开始匹配尝试,匹配字符"t"失败,控制权还在a上,将从位置1开始尝试,匹配字符"f"失败,控制权还是在a上,将从2位置开始匹配,匹配字符“a”成功,然后控制权转交给"b",从位置3处开始匹配,配字符"b"成功,记录下这个匹配结果。控制权再次回到"a"(因为/g需要找出全部), 它从位置3(这个地方很重要)处开始匹配,匹配字符"b"失败,控制权还在"a"上,接着往下匹配,直到从位置6处,匹配字符"a"成功,控制权转交给"b", 从位置7开始匹配,匹配字符5失败, 控制权回到a上,接着往下匹配,直到从位置11处,匹配字符"a"成功,控制权转交给"b",从位置12开始匹配,匹配字符"b"成功,记录下这个匹配结果。所以最终匹配结果是两次ab,一次在index=2,一次在index=11. 我们再来回顾下过程,可以得到以下总结:正则匹配都是从正则第一个条件开始(例子中d的"a"), 去找字符串的第一位。在没有/g情况下,条件1成立再看条件2,直到所有条件都成立,就匹配结束,如果有条件没成立,正则的第一个条件接着去找字符串的第二位,如此往复尝试。在有/g情况下,匹配成功后,也会接着往下匹配,知道所有字符串位被正则校验过。 建议大家多读几遍这个流程

June 20, 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

正则表达式-捕获组

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

Golang 正则表达式(regexp)

Go内置了(regexp包)对正则表达式的支持,这里是一般的正则表达式常规用法的例子。示例: package mainimport ( “bytes” “fmt” “regexp”)func main() { //是否匹配字符串 // .匹配任意一个字符 ,匹配零个或多个 ,优先匹配更多(贪婪) match, _ := regexp.MatchString(“H(.)d!”, “Hello World!”) fmt.Println(match) //true //或 match, _ = regexp.Match(“H(.)d!”, []byte(“Hello World!”)) fmt.Println(match) //true //或通过Compile来使用一个优化过的正则对象 r, _ := regexp.Compile(“H(.)d!”) fmt.Println(r.MatchString(“Hello World!”)) //true // 这个方法返回匹配的子串 fmt.Println(r.FindString(“Hello World! world”)) //Hello World! //同上 fmt.Println(string(r.Find([]byte(“Hello World!”)))) //Hello World! // 这个方法查找第一次匹配的索引 // 的起始索引和结束索引,而不是匹配的字符串 fmt.Println(r.FindStringIndex(“Hello World! world”)) //[0 12] // 这个方法返回全局匹配的字符串和局部匹配的字符,比如 // 这里会返回匹配H(.*)d!的字符串 // 和匹配(.*)的字符串 fmt.Println(r.FindStringSubmatch(“Hello World! world”)) //[Hello World! ello Worl] // 和上面的方法一样,不同的是返回全局匹配和局部匹配的 // 起始索引和结束索引 fmt.Println(r.FindStringSubmatchIndex(“Hello World! world”)) //[0 12 1 10] // 这个方法返回所有正则匹配的字符,不仅仅是第一个 fmt.Println(r.FindAllString(“Hello World! Held! world”, -1)) //[Hello World! Held!] // 这个方法返回所有全局匹配和局部匹配的字符串起始索引,只匹配最大的串 // 和结束索引 fmt.Println(r.FindAllStringSubmatchIndex(“Hello World! world”, -1)) //[[0 12 1 10]] fmt.Println(r.FindAllStringSubmatchIndex(“Hello World! Held! world”, -1)) //[[0 18 1 16]] // 为这个方法提供一个正整数参数来限制匹配数量 res, _ := regexp.Compile(“H([a-z]+)d!”) fmt.Println(res.FindAllString(“Hello World! Held! Hellowrld! world”, 2)) //[Held! Hellowrld!] fmt.Println(r.FindAllString(“Hello World! Held! world”, 2)) //[Hello World! Held!] //注意上面两个不同,第二参数是一最大子串为单位计算。 // regexp包也可以用来将字符串的一部分替换为其他的值 fmt.Println(r.ReplaceAllString(“Hello World! Held! world”, “html”)) //html world // Func变量可以让你将所有匹配的字符串都经过该函数处理 // 转变为所需要的值 in := []byte(“Hello World! Held! world”) out := r.ReplaceAllFunc(in, bytes.ToUpper) fmt.Println(string(out)) // 在 b 中查找 reg 中编译好的正则表达式,并返回第一个匹配的位置 // {起始位置, 结束位置} b := bytes.NewReader([]byte(“Hello World!”)) reg := regexp.MustCompile(\w+) fmt.Println(reg.FindReaderIndex(b)) //[0 5] // 在 字符串 中查找 r 中编译好的正则表达式,并返回所有匹配的位置 // {{起始位置, 结束位置}, {起始位置, 结束位置}, …} // 只查找前 n 个匹配项,如果 n < 0,则查找所有匹配项 fmt.Println(r.FindAllIndex([]byte(“Hello World!”), -1)) //[[0 12]] //同上 fmt.Println(r.FindAllStringIndex(“Hello World!”, -1)) //[[0 12]] // 在 s 中查找 re 中编译好的正则表达式,并返回所有匹配的内容 // 同时返回子表达式匹配的内容 // { // {完整匹配项, 子匹配项, 子匹配项, …}, // {完整匹配项, 子匹配项, 子匹配项, …}, // … // } // 只查找前 n 个匹配项,如果 n < 0,则查找所有匹配项 reg = regexp.MustCompile((\w)(\w)+) //[[Hello H o] [World W d]] fmt.Println(reg.FindAllStringSubmatch(“Hello World!”, -1)) //[[Hello H o] [World W d]] // 将 template 的内容经过处理后,追加到 dst 的尾部。 // template 中要有 $1、$2、${name1}、${name2} 这样的“分组引用符” // match 是由 FindSubmatchIndex 方法返回的结果,里面存放了各个分组的位置信息 // 如果 template 中有“分组引用符”,则以 match 为标准, // 在 src 中取出相应的子串,替换掉 template 中的 $1、$2 等引用符号。 reg = regexp.MustCompile((\w+),(\w+)) src := []byte(“Golang,World!”) // 源文本 dst := []byte(“Say: “) // 目标文本 template := []byte(“Hello $1, Hello $2”) // 模板 m := reg.FindSubmatchIndex(src) // 解析源文本 // 填写模板,并将模板追加到目标文本中 fmt.Printf("%q”, reg.Expand(dst, template, src, m)) // “Say: Hello Golang, Hello World” // LiteralPrefix 返回所有匹配项都共同拥有的前缀(去除可变元素) // prefix:共同拥有的前缀 // complete:如果 prefix 就是正则表达式本身,则返回 true,否则返回 false reg = regexp.MustCompile(Hello[\w\s]+) fmt.Println(reg.LiteralPrefix()) // Hello false reg = regexp.MustCompile(Hello) fmt.Println(reg.LiteralPrefix()) // Hello true text := Hello World! hello world // 正则标记“非贪婪模式”(?U) reg = regexp.MustCompile((?U)H[\w\s]+o) fmt.Printf("%q\n”, reg.FindString(text)) // Hello // 切换到“贪婪模式” reg.Longest() fmt.Printf("%q\n", reg.FindString(text)) // Hello Wo // 统计正则表达式中的分组个数(不包括“非捕获的分组”) fmt.Println(r.NumSubexp()) //1 //返回 r 中的“正则表达式”字符串 fmt.Printf("%s\n", r.String()) // 在 字符串 中搜索匹配项,并以匹配项为分割符,将 字符串 分割成多个子串 // 最多分割出 n 个子串,第 n 个子串不再进行分割 // 如果 n < 0,则分割所有子串 // 返回分割后的子串列表 fmt.Printf("%q\n", r.Split(“Hello World! Helld! hello”, -1)) //["" " hello"] // 在 字符串 中搜索匹配项,并替换为 repl 指定的内容 // 如果 rep 中有“分组引用符”($1、$name),则将“分组引用符”当普通字符处理 // 全部替换,并返回替换后的结果 s := “Hello World, hello!” reg = regexp.MustCompile((Hell|h)o) rep := “${1}” fmt.Printf("%q\n", reg.ReplaceAllLiteralString(s, rep)) //"${1} World, hello!" // 在 字符串 中搜索匹配项,然后将匹配的内容经过 repl 处理后,替换 字符串 中的匹配项 // 如果 repb 的返回值中有“分组引用符”($1、$name),则将“分组引用符”当普通字符处理 // 全部替换,并返回替换后的结果 ss := []byte(“Hello World!”) reg = regexp.MustCompile("(H)ello") repb := []byte("$0$1") fmt.Printf("%s\n", reg.ReplaceAll(ss, repb)) // HelloH World! fmt.Printf("%s\n", reg.ReplaceAllFunc(ss, func(b []byte) []byte { rst := []byte{} rst = append(rst, b…) rst = append(rst, “$1”…) return rst })) // Hello$1 World!}小结:1、r, _ := regexp.Compile(“H(.)d!")可用一下代替r := regexp.MustCompile(“H(.)d!")两者区别 MustCompile 少一个返回值err看源码// Compile parses a regular expression and returns, if successful,// a Regexp object that can be used to match against text.//…// For POSIX leftmost-longest matching, see CompilePOSIX.func Compile(expr string) (*Regexp, error) { return compile(expr, syntax.Perl, false)}// MustCompile is like Compile but panics if the expression cannot be parsed.// It simplifies safe initialization of global variables holding compiled regular// expressions.func MustCompile(str string) *Regexp { regexp, err := Compile(str) if err != nil { panic(regexp: Compile( + quote(str) + ): + err.Error()) } return regexp}2、regexp的处理byte的方法都有个string方法对应,两者功能一样。例如:regexp.Match()和regexp.MatchString()links目录 ...

February 22, 2019 · 3 min · jiezi

javascript replace高级用法

在前端与后台交互的时候我们通常都需要将后台传递的数据绑定到html中,这个绑定数据的方式我们通常是使用jQuery或者使用原生的innerHTML进行绑定,当然也可以使用artTemplate模板来绑定数据,那么artTemplate模板它绑定数据的原理是什么呢?其实它就是利用了replace()方法。对于正则replace约定了一个特殊标记符”$”:1)、$i(i取值范围1~99):表示从左到右正则子表达式所匹配的文本2)、$&:表示与正则表达式匹配的全部文本3)、$(:1旁边的那个键):表示匹配字符串的左边文本4)、$’(’:单引号):表示匹配字符串的右边文本5)、$$:表示$转移1、replace基本用法<script type=“text/javascript”> /要求将字符串中所有的a全部用A代替/ var str = “javascript is great script language!”; //只会将第一个匹配到的a替换成A console.log(str.replace(“a”,“A”)); //只会将第一个匹配到的a替换成A。因为没有在全局范围内查找 console.log(str.replace(/a/,“A”)); //所有a都被替换成了A console.log(str.replace(/a/g,“A”));</script>1.1、replace基本用法之替换移除指定class类<script type=“text/javascript”> /要求将下面这个元素中的unabled类移除掉/ <div class=”confirm-btn unabled mb-10” id=”j_confirm_btn”>提交</div> var classname = document.getElementById(“j_confirm_btn”).className; /(^|\s)表示匹配字符串开头或字符串前面的空格,(\s|$)表示匹配字符串结尾或字符串后面的空格/ var newClassName = classname.replace(/(^|\s)unabled(\s|$)/,””); document.getElementById(“j_confirm_btn”).className = newClassName;</script>2、replace高级用法之 —- $i2.1、简单的$i用法<script> /要求:将字符串中的双引号用"-“代替/ var str = ‘“a”, “b”’; console.log(str.replace(/”[^"]"/g,"-$1-")); //输出结果为:-$1-, -$1- /解释:$1就是前面正则(/"[^"]"/g)所匹配到的每一个字符。/</script>2.2、$i与分组结合使用<script> /要求:将下面字符串替换成:javascript is fn.it is a good script language/ var str = “javascript is a good script language”; console.log(str.replace(/(javascript)\s*(is)/g,"$1 $2 fn.it $2")); /解释:每一对括号都代表一个分组,从左往右分别代表第一个分组,第二个分组…;如上"(javascript)“为第一个分组,"(is)“为第二个分组。$1就代表第一个分组匹配的内容,$2就代表第二个分组匹配的内容,依此类推…/</script>2.3、$i与分组结合使用—-关键字高亮显示当我们使用谷歌搜索的时候我们会发现我们搜索的关键字都被高亮显示了,那么这种效果用JavaScript能否显示呢?答案是可以的,使用replace()很轻松就搞定了。<script> /要求:将下列字符串中的"java"用红色字体显示/ var str = “Netscape在最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme。”; document.write(str.replace(/(java)/gi,’<span style=“color: red;font-weight: 800;">$1</span>’)); /解释:必须要开启全局搜索和忽略大小写,否则匹配不到所有的”java”字符/</script>2.4、反向分组—-分组的反向引用在正则中,当我们需要匹配两个或多个连续的相同的字符的时候,就需要用到反向引用了,查找连续重复的字符是反向引用最简单却也是最有用的应用之一。上面的”$i”也是反向分组的一种形式,这里再介绍另一种反向分组。<script type=“text/javascript”> / /ab(cd)\1e/ 这里的 \1 表示把第1个分组的内容重复一遍*/ console.log(/ab(cd)\1e/.test(“abcde”));//false console.log(/ab(cd)\1e/.test(“abcdcde”));//true /要求:将下列字符串中相领重复的部分删除掉”/ var str = “abbcccdeee”; var newStr = str.replace(/(\w)\1+/g,"$1”); console.log(newStr); // abcde</script>3、replace高级用法之参数二为函数replace函数的第二个参数不仅可以是一个字符,还可以是一个函数!3.1、参数二为函数之参数详解<script> var str = “bbabc”; var newStr = str.replace(/(a)(b)/g,function (){ console.log(arguments);//[“ab”, “a”, “b”, 2, “bbabc”] /*参数依次为: 1、整个正则表达式所匹配到的字符串—-“ab” 2、第一个分组匹配到的字符串,第二个分组所匹配到的字符串….依次类推一直 到最后一个分组—-“a,b” 3、此次匹配在源字符串中的下标,返回的是第一个匹配到的字符的下标—-2 4、源字符串—-“bbabc” */ })</script>3.2、参数二为函数之首字母大写案例<script> /要求:将下列字符串中的所有首字母大写/ var str = “Tomorrow may not be better, but better tomorrow will surely come!”; var newStr = str.replace(/\b\w+\b/gi,function (matchStr){ console.log(matchStr);//匹配到的字符 return matchStr.substr(0,1).toUpperCase() + matchStr.substr(1); }); console.log(newStr);</script>3.3、参数二为函数之绑定数据—-artTemplate模板核心<h1>周星驰喜剧电影:</h1><div id=“content”></div><script type=“text/javascript”> var data = { name: “功夫”, protagonist: “周星驰” }, domStr = ‘<div><span>名称:</span><span>{{name}}</span></div><div><span>导演:</span><span>{{protagonist}}</span> </div>’; document.getElementById(“content”).innerHTML = formatString(domStr,data); /绑定数据的核心就是使用正则进行匹配/ function formatString(str,data){ return str.replace(/{{(\w+)}}/g,function (matchingStr,group1){ return data[group1]; }); }</script>4、replace高级用法之获取与正则表达式匹配的文本4.1、replace高级用法之获取与正则表达式进行匹配的源字符串<script> var str = “i am a good man”; var newStr = str.replace(/good/g,"$&”); console.log(newStr);//结果:输出i am a good man /解释:在这里”$&”就是与正则表达式进行匹配的那个源字符串/</script>4.2、replace高级用法之获取正则表达式匹配到的字符<script> /*要求:将"i am a good man"替换成"i am a good-gond man" / var str = “i am a good man”; var newStr = str.replace(/good/g,"$&-$&"); console.log(newStr); /解释:在这里”$&”可以获取到前面正则表达式匹配的内容,如上面的”$&”就是正则表达式匹配到的”good”/</script>5、replace高级用法之获取正则匹配的左边的字符<script> /要求:将下列字符串替换成"java-java is a good script"/ var str = “javascript is a good script”; var newStr = str.replace(/script/,"-$"); console.log(newStr) /*解释:"$“获取的是正则左边的内容,如上正则中"script"字符前面的是"java”,"-$"就是"-java","-$“会把script替换掉。/</script>6、replace高级用法之获取正则匹配的右边的字符<script> /要求:将下列字符替换成"java is a good language!it is a good script is a good script”/ var str = “javascript is a good script”; var newStr = str.replace(/script/," is a good language!it$’"); console.log(newStr) /解释:"$’“获取的就是str右边的内容,如上正则中”$’“就是” is a good script"。 " is a good language!it$’“会把正则匹配到的"script"替换掉/</script> ...

February 16, 2019 · 2 min · jiezi

Nunjucks使用正则表达式示例

我在使用egg.js时,他用的模板引擎是Nunjucks,其中有个地方需要用到正则,可是官方文档基本上写了跟没写一样,官方的正则表达式。于是我便去找例子了。正则表达式在Nunjucks中使用正则表达式的示例:{% set regExp = r/^foo.*/g %}{% if regExp.test(‘foo’) %} Foo in the house!{% endif %}那么这个就会被正常显示。其他的表达式也是可以的。例如:<!– 有个后台存储的未验证的手机号码(mobile)在前端显示,如果格式正确则显示,不正确则显示“暂无” –>{% set regExp = r/^\d{11}$/g %}<span>号码:{{mobile if regExp.test(mobile) else ‘暂无’}}</span>这两个例子应该看得懂吧。正则这块我并没有看源码,因为搜索出来了,我这里参考的regex exmaple?后来发现其实很多方法文档并没有写出来,这时候可能真的需要看看源码了,有兴趣的话可以阅读下filter的源码https://github.com/mozilla/nu…

January 15, 2019 · 1 min · jiezi

29.22分钟学会书写正则

写在最前面看到标题你可能会疑惑为什么不是30分钟?因为我这个文章图文并茂,非常恐怖,兄弟,其实你不用30分钟就可以看懂。你可能会以为我在吹牛B,但是当你看完的时候,一掐表,你会发现我真的是在吹牛B那又为什么是.22呢?作为一个理科生,保留两位小数是不变的信仰。而在下,仅仅是喜欢2这个数字,如是而已正则表达式正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换、校验那些符合某个模式(规则)的文本。RegExp对象在爪洼死苦瑞per特中,RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。那么要如何使用呢?两种方式:字面量,构造函数var reg = /\bhello\b/g //字面量 // \b代表单词边界(WordBoundary) 也就是说这个正则匹配的是 hello world这种hello 而不是helloworld//因为helloworld连起来了,没有单词边界var reg = new RegExp(’\bhello\b’,‘g’)//注意两者的区别//后面这种方法需要转义反斜杠(javascript的原因),//而且这个g(修饰符)是单独提取出来的//而且正则两边没有/包围的,上面第一种是这样的=> /正则表达式/正则可视化工具Regulex可视化图形,对理解正则有非常大的帮助二话不说先进来这个网站,这个文章将使用这个网站来验证写的例子。元字符正则表达式由两种基本字符类组成原义字符元字符原义字符,就是表示原本意思的字符,像上面正则中的hello,就代表匹配hello这个字符串元字符呢,就是表示不是原本意思的字符,这样想就简单多了吧。像上面这个\b既然元字符表示的不是本事的字符,那我如果就要匹配它原本的字符呢?比如说我就要匹配+号,号,那么请使用 \ 来转义字符下面这些元字符先随便过一遍先,不用背熟也可往下看~$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ’n’ 或 ‘r’。要匹配 $ 字符本身,请使用 $。() 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 。+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。. 匹配除换行符 n 之外的任何单字符。要匹配 . ,请使用 . 。[] 标记一个中括号表达式的开始。要匹配 [,请使用 [。{} 标记限定符表达式的开始。要匹配 {,请使用 {。| 指明两项之间的一个选择。要匹配 |,请使用 |。? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ’n’ 匹配字符 ’n’。’n’ 匹配换行符。序列 ‘' 匹配 “",而 ‘(’ 则匹配 “("。^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。\cX 匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。\f 匹配一个换页符。等价于 x0c 和 cL。\n 匹配一个换行符。等价于 x0a 和 cJ。\r 匹配一个回车符。等价于 x0d 和 cM。\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。注意 Unicode 正则表达式会匹配全角空格符。\S 匹配任何非空白字符。等价于 1。\t 匹配一个制表符。等价于 x09 和 cI。\v 匹配一个垂直制表符。等价于 x0b 和 cK边界从一开始的例子我们就知道了这个b,不对,是这个\b他表示的就是单词边界的意思.我们知道,fck这个是有很多用法的,可以单独用,也可以加个ing多种词性使用。然后我们只想找到单独的fck,看代码//作为光荣的社会主义接班人怎么可能用fck做例子呢?var reg = /\bis\b/g;var str = “this is me”;str.replace(reg,‘X’)//“this X me"var reg = /is/g;var str = “this is me”;str.replace(reg,‘X’)//“thX X me"两者区别清晰可见,不容我多说了吧,各位客官。再来看看一个问题,如果我只要开头部分的A字符而文本中间的A字符却不要,又该如何?只需如此,便可对敌var reg = /^A/g;var str = “ABA”;str.replace(reg,‘X’);//“XBA"需要以A为结尾的正则,则是如下var reg = /A$/g;var str = “ABA”;str.replace(reg,‘X’);//“ABX"注意,正如开头结尾的位置一样,^和$的位置也是如此,^放在正则表达式前面,$放在表达式后面字符类一般情况下,正则表达式一个字符对应字符串的一个字符比如表达式 \bhello 就表示 匹配 字符\b h e l l o,如果我们想要匹配一类字符的时候?比如我要匹配a或者b或者c,我们就可以使用元字符 []来构建一个简单的类[a,b,c]就把a,b,c归为一类,表示可以匹配a或者b或者c。如果你会一丢丢英文的话,你应该就可以看懂下面的图,one of a,b,c,也就是匹配abc中任意一个范围类当我们学习了上面的内容以后,如果我们要写匹配0到9的数字,就应该是这样写但是如果我要匹配更多呢?那不是键盘都要敲烂了?这正则也太不智能了吧???显然,你能想到的,创造正则的人也想到了我们可以这样子好了,方便了一些,然后你可能又会吃惊,那么我的短横线-呢?我如果要匹配0-9以及短横线呢?莫慌,只要在后面补回去即可这个图可以清楚看到有两条分支,也就是说我可以走0-9这条路也可以走短横线这条路预定义类学习了上面以后,我们就可以书写匹配数字的正则了,[0-9]那么有没有更简便更短的方法呢?巧了,正则就是辣么强大在上面的元字符部分内容中,你可能已经窥得其中精妙了上表格,不是,上图(这个segmentfault哪里插入表格啊??)我们可以根据英文单词的意思,来记住这些预定义类的用法。我们发现,大写字母和小写字母的区别就是取反!,如d和D同时我们从表格中的等价类可以发现如果我们要一个类的取反,那么就在类中加一个 ^none of abc量词如果要你写一个匹配10个数字的正则?你会怎么写诶你可能已经胸有成竹的写下了\d\d\d\d\d\d\d\d\d\d吃惊,你会发现,尽管是你单身二十余年的右手,依然感到了一丝乏力!疲惫,有时是在过度劳累之后为了挽救一些人的右臂,正则有了量词实现上面的需求我们只要 \d{10}Digit 10times为了方便一些英语不好的人,比如我,我甚至使用了鲜为人知的百度翻译(广告费私我)但是,如果我不知道要匹配具体多少个数字呢?反正就是匹配100个到1000个之间的数字当当当当让我们看看可视化工具的结果,方便理解注意,这个{n,m}是包括n次和m次的哦,是闭区间哦贪婪模式与非贪婪模式从上面一则我们知道,如果我们要匹配100到1000个数字的话,是这样写\d{100,1000}如果我给的字符串里有1000个数字,但是我只想匹配前面100个呢?如果按照上面这样写,则如下var reg = /\d{3,6}/;var str = “123456789”;str.replace(reg,‘替换成这个’);//“替换成这个789"我们可以看到,上面这个例子是匹配了6个数字,将6个数字替换了,尽管他的正则匹配的是3到6个数字。没错,它是贪婪的!它会尽可能地匹配更多!这就是正则的 贪婪匹配,这是默认的,如果我们不想要那么贪婪,如何变得容易满足一点?只需要在量词后面加上 ? 即可var reg = /\d{3,6}?/;var str = “123456789”;str.replace(reg,‘替换成这个’);//“替换成这个456789"可以清楚看到正则只匹配了前面3个数字这就是正则的非贪婪模式分支条件如果我只需要匹配100个或者1000个数字呢?就只有100和1000两种可能,而不是100到1000任意一个数字,又该如何对敌?这就要设计到正则的分支条件了\d{100}|\d{1000}需要注意的是这个 | 分割的是左右两边所有部分,而不是仅仅连着这个符号的左右两部分,看下图有时候我们只需要一部分是分支,后面走的是同一条主干,只需要把分支用()包含即可注意:这个匹配是从正则左边的分支条件开始的,如果左边满足了,那么右边就不会在对比!var reg = /\d{4}|\d{2}/var str = “12345"str.replace(reg,‘X’);// “X5"var reg = /\d{2}|\d{4}/var str = “12345"str.replace(reg,‘X’);//“X345"分组当我们要匹配一个出现三次的单词而不是数字的时候,会怎么写呢?你可能会这样写hello{3}然后你打开可视化工具妈耶,居然只重复了我的o字母!死渣则,好过分其实,我们只要使用()就可以达到分组的目的,使量词作用于分组,上面分支条件中的括号亦是如此前瞻/后顾sometimes,我们要找寻的字符可能还要依靠前后字符来确定比如说我要替换连续的2个数字,而且它的前面要连着是2个英文字母,这样的数字我才要你可能会疑惑,这样写不就完事了吗?\d{2}\w{2}上面匹配的是2个数字和2个字母,虽然是连着的,但是匹配了是4个字符,如果我要替换匹配文本的话,那就替换了4个字符,而我们只想替换2个数字!这个时候就需要用到断言了首先我们需要明白几个点正则表达式从文本头部到尾部开始解析,文本尾部方向叫做‘前’,也就是往前走,就是往尾巴走前瞻就是正则表达式匹配到规则(此例中的‘2个数字’)的时候,向前看看,看看是否符合断言(此例中的‘前面连着2个字母’),后瞻/后顾的规则则相反。(javascript不支持后顾)上表格!根据表格内容,我们就可以解决这个问题了,注意\w包括数字哦题目要求是连着2个字母var reg = /\d{2}(?=[a-zA-Z]{2})/;var str = “1a23bc456def”;str.replace(reg,‘X’);//“1aXbc456def"只替换了数字,没有替换后面的断言哦!顺便把这个负向前瞻看看吧看到这个not followed by 我想你应该知晓用法了嘿嘿嘿正则就介绍到这里啦下篇文章将介绍javascript中的正则对象的属性,以及一些方法。如果有意见或者建议,请在评论区中指出,谢谢 fnrtv ↩ ...

November 9, 2018 · 1 min · jiezi