当前位置: 首页 > 后端技术 > PHP

正则表达式:从抄写到手写

时间:2023-03-29 20:01:14 PHP

1.RegExp对象JavaScript有两种方法来实例化RegExp对象文字构造函数文字constreg=/all/;console.log(reg);///all/'这就是我所有的。'.replace(reg,'ALL');//这就是我所有的。构造函数constreg=newRegExp('all');console.log(reg);///all/'这就是我所有的。'.replace(reg,'ALL');//这就是我所有的。2.Metacharacterliteralliteralcharacter一个metacharacterliteralliteralcharacter代表它应该成为的字符。例如,正则表达式为/abc/、/123/;它们分别匹配abc和123,元字符是正则表达式中具有特殊含义的非数字字符。如:\b\d\w。+()等。有些元字符的含义不是唯一的,不同的写法含义可能不同。元字符表:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html3.并不是所有的正则表达式都像前面写的那么简单,因为正则表达式的语法有些复杂,我们在写看别人写的正则表达式,或多或少都会有一些错误,或者难以理解。如果将下面的正则表达式转换成下图,将有助于我们理解正则表达式的含义。^http(|s):\/\/[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+\/$给大家推荐一个工具https://regexper.com4。量词字符的含义+出现一次或多次(至少出现一次)?出现零次或一次(最多出现一次)*出现零次或多次(任意次数){n}出现n次{n,m}出现n到m次{n,}至少出现n次//\d表示匹配数字//匹配数字'1234567890'.replace(/\d/,'a');//a234567890//匹配一个或多个数字(至少匹配一个)'1234567890'.replace(/\d+/,'a');//a'1234567890'.replace(/\d?/,'a');//a234567890'1234567890'.replace(/\d*/,'a');//a'1234567890'.replace(/\d{3}/,'a');//a4567890'1234567890'.replace(/\d{2,4}/,'a');//a567890'1234567890'.replace(/\d{3,}/,'a');//a'12'.replace(/\d{3,}/,'a');//12使用工具https://regexper.com/Diagram\d{2,6}5.贪心模式和非贪心模式从上面4.量词例子,'1234567890'.replace(/\d+/,'A');输出是a而不是a234567890;'1234567890'.replace(/\d{2,4}/,'a');输出是a567890而不是a34567890。贪心模式:正则表达式尽可能多地匹配,直到匹配失败。非贪婪模式:正则表达式尽量少匹配,一旦匹配成功,就不再匹配。因为默认情况下,正则表达式是使用贪婪模式匹配的。如果您希望正则表达式使用非贪婪模式匹配,请添加一个?在量词之后。'1234567890'.replace(/\d{2,4}/,'a');//a567890'1234567890'.replace(/\d{2,4}?/,'a');//a34567890'1234567890'.replace(/\d+/,'a');//a'1234567890'.replace(/\d+?/,'a');//a2345678906。在正则表达式中,您可以使用[]来构建类。正则表达式中的类是指满足一定特征的对象字符类。正则表达式[abcd]是将a,b,c,d归为一类,这个表达式可以匹配到这一类字符'12345a6b7c8D9e'.replace(/[abcd]/g,'|');//12345|6|7|8D9e范围类正则表达式提供[a-z]表示a到z的任意字符(包括a和z)'1a2b3c4q5z'.replace(/[a-z]/g,'|');//1|2|3|4|5|'1a2b3c4T5Z'.replace(/[a-z]/g,'|');//1|2|3|4T5Z'1a2b3c4T5Z'.replace(/[a-zA-Z]/g,'|');//1|2|3|4|5|'1a2b3c4q5z'.replace(/[0-9]/g,'|');//|a|b|c|q|z[a-zA-Z0-9]预定义类字符等同于\d[0-9]数字字符\D[^0-9]非数字字符\w[a-zA-Z0-9_]字母、数字、下划线(单词字符)\W[^a-zA-Z0-9_]非字母、数字、下划线(不是单词字符)\s[\t\n\x0B\f\r]空白字符\S[^\t\n\x0B\f\r]非空白字符。[^\n\r]除换行和回车之外的任何字符7.边界字符含义^以xxx开始$以xxx\bwordboundary\Bnon-wordboundary'img/png/img-1.png'.replace(/img/g,'image')结束;//image/png/image-1.png'img/png/img-1.png'.replace(/^img/g,'image');//图像/png/img-1.png'img/png/img-1.png'.replace(/png/g,'jpg');//img/jpg/img-1.jpg'img/png/img-1.png'.replace(/png$/g,'jpg');//img/png/img-1.jpg'这就是我的全部。'.replace(/is/g,'IS');//ThisisallIhave.'这就是我所有的。'.replace(/\bis\b/g,'IS');//ThisISallIhave.'ThisisallIhave.'.replace(/\Bis\b/g,'IS');//这就是我所有的。9.分组|与量词一起使用将反向引用与|一起使用使用/http(|s):\/\///http(|s):\/\//.test('https://');//true/http(|s):\/\//.test('http://');//真/a(b|c)d/.test('ad');//假/a(b|c)d/.test('abd');//真/a(b|c)d/.test('acd');//如何使用true和量词匹配javascript出现两次javascriptjavascript?/javascript{2}/.test('javascriptjavascript');//false/javascript{2}/.test('javascript');//true/(javascript){2}/.test('javascriptjavascript');//当真正的反向引用包含分组的正则表达式并且匹配成功时,将子表达式匹配的内容保存在内存中按编号编号的组中,可以简单地认为是对局部变量的赋值。这时候就可以通过反向引用来引用这个局部变量的值了。在很多情况下,我们可能需要将某种格式的字符串转换成另一种格式的字符串。例如:将05/28/2018转换为2018-05-28;将Markdown超链接[Test](https://www.test.com/)转换为HTML超链接Test'05/28/2018'.replace(/(\d{2})\/(\d{2})\/(\d{4})/,'$3-$1-$2');//=>2018-05-28'[测试](https://www.test.com/)'.replace(/\[(.+)\]\((http(|s):\/\/.+)\)/,'$1');//=>测试忽略分组有时我们会多次使用分组写正则表达式,但是有些组不需要反向引用,比如正则表达式/http(|s):\/\//组,我们不需要做反向引用,这时候应该用(?:)忽略组或不忽略组:/http(|s):\/\//忽略分组:/http(?:|s):\/\//10。Look-ahead和look-behind正则表达式从头(左)到尾(右)进行匹配,文本的尾部方向称为“前向”,文本头部的方向称为“向后”看-ahead:当正则表达式匹配规则时,它向前检查它是否匹配断言Backward:当正则表达式匹配规则时,它向后检查它是否匹配断言名称regular含义Forwardlookaheadexp(?=assert)向前检查一个与断言匹配的否定前瞻exp(?!assert)向前检查与断言不匹配的肯定前瞻(?<=assert)exp向后检查与断言匹配的否定前瞻(?image/png/img-1.png//img/png/img-1.png//img/png/img-1.png`img/png/img-1.pngimg/png/img-1.pngimg/png/img-1.png`.replace(/^img/gm,'image');//=>image/png/img-1.png//image/png/img-1.png//image/png/img-1.pngconstreg=/\d/gim;console.log(reg.source);//\d12。RegExp对象中的test()和exec()test()用于测试参数字符串中是否有匹配正则表达式模式的字符串;如果存在则返回true,否则返回falseconstreg=/\w/;reg.test('|');//falsereg.test('a');//truereg.test('a');//true使用g全文搜索时,测试函数会出现以下问题:上面的问题其实是正则的表达式对象的lastIndex属性有问题。如果正则表达式使用全文搜索g,想避免上述问题,在执行测试函数constreg=/\w/g;reg.test('ab')之前,应该将lastIndex设置为0;//truereg.lastIndex=0;reg.test('ab');//truereg.lastIndex=0;reg.test('ab');//trueexec()使用正则表达式方式对字符串执行搜索并以数组形式返回匹配到的结果,如果没有匹配到则返回空结果数组属性索引:匹配字符第一个字符输入的位置:第一个返回数组的元素是匹配的字符串表达式匹配的内容第二个元素是第一个子表达式匹配的内容第三个元素是第二个子表达式匹配的内容(以此类推)下面的字符串数组存在,我们使用exec从每个元素中提取图片的路径constarr=['[Test1](https://www.test1.com/img/img-1.png)','[Test1](http://www.test1.com/img/img-1.jpg)','[测试2](https://static.test2.com/image/haha/img-1.png)']正则表达式:constreg=/\[.+\]\(http(|s):\/\/[a-zA-Z0-g_-]+(\.[a-zA-Z0-9_-]+)+\/((.+\/)+.+\.(png|jpg))\)/;constres=reg.exec(arr[2]);上面的正则表达式使用了较多的分组,我们在看图的时候可能会造成干扰,忽略不必要的分组constreg2=/\[.+\]\(http(?:|s):\/\/[a-zA-Z0-g_-]+(?:\.[a-zA-Z0-9_-]+)+\/((?:.+\/)+.+\.(?:png|jpg))\)/;reg2.exec(arr[2]);