当前位置: 首页 > Web前端 > JavaScript

正则笔记-语法

时间:2023-03-27 11:22:07 JavaScript

前言本文记录正则表达式的语法学习实践。常规常见使用场景:数据校验,比如检查时间字符串是否符合格式;数据爬取,以特定顺序爬取包含特定文本或内容的网页;数据打包,将数据从一种原始格式转换为另一种格式;字符串解析,比如捕获拥有的URL的GET参数,或者捕获一组括号内的文本;字符串替换,用另一个字符替换字符串中的一个字符。在线工具辅助学习:https://regex101.com/https://jex.im/regulex/使用规则解释基本语句正则表达式(可称为“regexp”或“reg”)包括扩展模式和可选修饰符。创建正则表达式对象有两种语法。更长的语法:regexp=newRegExp("pattern","flags");更短的语法,使用斜杠“/”:regexp=/pattern/;//没有修饰符regexp=/pattern/gim;//这两种带有修饰符g、m和i的语法之间的主要区别(稍后会详细介绍)是使用斜杠/.../的模式不允许表达式的插值(例如使用${...}字符串模板).它是完全静态的。当我们在编写代码时知道正则表达式时,我们会使用斜线——这是最常见的情况。当我们需要从动态生成的字符串“即时”创建正则表达式时,会更频繁地使用newRegExp。例如:lettag=prompt("Whattagdoyouwanttofind?","h2");letregexp=newRegExp(`<${tag}>`);//如果在提示中输入上面的答案是“h2”,与/

/g(global)一样的修饰符在第一次匹配后不会返回结果,它会继续搜索剩下的文本。i(insensitive)使整个表达式不区分大小写(例如/aBc/i将匹配AbC)。m(多行)启用多行模式,它只影响^和$的行为。在多行模式下,它们不仅匹配文本的开头和结尾,还匹配每一行的开头和结尾。y(sticky)sticky修饰符y使regexp.exec精确搜索位置lastIndex而不是“从”它开始。m修饰符多行模式:在这个多行文本的例子中,模式/^\d/gm将从每行的开头取一个数字:letstr=`第一名:Winnie第二名:Piglet第三名:Eeyore`;console.log(str.match(/^\d/gm));//当1,2,3没有修饰符m时,只会匹配第一个数字1。搜索修饰符y:letstr='letvarName="value"';让正则表达式=/\w+/y;regexp.lastIndex=3;警报(regexp.exec(str));//null(位置3有空格,不是单词)regexp.lastIndex=4;alert(regexp.exec(str));//varName(wordatposition4)注意:/xxx/gi//修饰符可以重复使用,不区分大小写+全字匹配转义,特殊字符存在于特殊字符正则表达式中,这些字符在正则表达式中有特殊含义,比如[]{}()\^$。|?*+。它们用于执行更强大的搜索。要将特殊字符用作常规字符,请在其前面加上反斜杠:\,这是转义字符。alert("第5.1章".match(/\d\.\d/));//5.1(匹配!)当将字符串传递给新的RegExp时,我们需要双反斜杠\\因为字符字符串引号消耗反斜杠:letregStr="\\d\\.\\d";alert(regStr);//\d\.\d(现在)letregexp=newRegExp(regStr);alert("Chapter5.1".match(regexp));//5.1锚点:^和$^The匹配任何以“The”开头的字符串->试试吧!(https://regex101.com/r/cO8lqs/2)end$匹配以“end”结尾的字符串^end$extract匹配从“The”到“end”结尾的字符串吼匹配任何字符串定界符文本"roar":\b和\B\babc\b执行全词匹配搜索->尝试一下!(https://regex101.com/r/cO8lqs/25)\b表示像插入符一样的锚点(它与$和^相同)以匹配一侧是单词符号的位置(例如\w)和另一边不是单词符号(例如,它可能是字符串的开头或空格符号)。它还可以表示相反的非单词边界“\B”,它会匹配“\b”不会匹配的地方,如果我们想找到被单词字符包围的搜索模式,就可以使用它。\Babc\B只要模式被单词字符包围,它就会匹配->尝试一下!(https://regex101.com/r/cO8lqs/26)重复量词:*、+、?和{}abc*匹配“ab”后跟零个或多个“c”字符串->试试吧!(https://regex101.com/r/cO8lqs/1)abc+匹配“ab”后跟一个或多个“c”的字符串abc?匹配字符串abc{2}后跟“ab”后的零个或一个“c”匹配字符串abc后跟“ab”后的两个“c”{2,}匹配“ab”后跟两个或多个“c”的字符串abc{2,5}匹配“ab”后跟2到5个“c”字符串a(bc)*匹配字符串a(bc){2,5}后跟“a”后跟零个或多个“bc”序列匹配一个字符串或运算符后跟一个“a”,然后是2到5个“bc”序列:|,[]a(b|c)匹配后跟“b”或“c”的字符串->试试吧!(https://regex101.com/r/cO8lqs/3)a[bc]匹配字符串字符类后跟“a”后跟“b”或“c”:\d,\w,\s\d匹配数字类型的单个字符(0-9)->尝试一下!(https://regex101.com/r/cO8lqs/4)\w匹配单个单词(字母数字和下划线)->尝试一下!(https://regex101.com/r/cO8lqs/4)\s匹配单个空格字符(包括制表符\t和换行符\n)反向字符类:\D、\W、\S对于每个字符类,有是一个“反向类”,由相同的字母表示,但大写。\D匹配非数字:除\d之外的任何字符,例如字母。\w匹配非单词字符:除\w之外的任何字符,例如非拉丁字母或空格。\s匹配非空白符号:除\s之外的任何字符,例如字母。通配符:..匹配“任意字符”,即匹配“除换行符外的任意字符”。中间语句捕获组:()捕获函数(exp)匹配exp,将文本捕获到自动命名的组中(?exp)匹配exp,并将文本捕获到名为name的组中,也可以写成(?'name'exp)(?:exp)—匹配exp,不捕获匹配的文本位置规范(?=exp)匹配exp前的位置(?<=exp)匹配exp后的位置(?!exp)匹配后跟不是exp(?和a的字符串|b与|c相同->尝试一下!(https://regex101.com/r/cO8lqs/7)[a-c]匹配具有一个“a”、“ab”或“ac”的字符串->与a|b|c相同与[a-fA-F0-9]匹配代表十六进制数的字符串,不区分大小写->试一试!(https://regex101.com/r/cO8lqs/22)[0-9]%匹配%符号前有0到9字符的字符串[^a-zA-Z]匹配不带to的字符串z或A到Z,其中^是一个否定表达式->试试吧!(https://regex101.com/r/cO8lqs/10)请记住,在方括号内,所有特殊字符(包括反斜杠\)都会失去其应有的含义。贪婪和惰性量词量词(*+{})是贪婪的运算符,所以它们遍历给定的文本,尽可能匹配。例如,<.+>将匹配文本“Thisisa
simplediv
test”中的“
simplediv
”。为了只捕获div标签,我们需要使用“?”使贪婪搜索有点懒惰:<.+?>匹配“<”和“>”中的任何字符一次或多次,并且可以根据需要扩展->尝试一下!(https://regex101.com/r/cO8lqs/24)注意更好的解决方案应该避免使用“.”,这有利于更严格的正则表达式:<[^<>]+>onceormatchany“<”和“>”内的字符多次,“<”或“>”字符除外->尝试一下!(https://regex101.com/r/cO8lqs/23)更懒惰的匹配:*?匹配任意次数,但越少越好+?匹配1次或多次,但尽可能少??匹配0或1,但越少越好{n,m}?match重复n到m次,但尽可能少重复{n,}?匹配重复n次以上,但尽量少重复总结:量词有两种工作模式:(1)贪心模式尽量重复量词字符。例如,\d+会消耗所有可能的字符。当它不能消耗更多时(末尾不再有数字或字符串),它就会匹配模式的其余部分。如果没有匹配,则减少重复次数(回溯),然后重试。(2)通过添加问号启用惰性模式?在量词之后。正则表达式引擎会在每次重复量化字符之前尝试匹配模式的其余部分。正如我们所见,懒惰模式并不是贪婪搜索的“灵丹妙药”。另一种方法是使用排除项“微调”贪婪搜索,例如模式“[^”]+。高级语句前瞻断言与后视断言x(?=y)—前瞻断言(零宽度前瞻断言):匹配x,但仅当x后跟y时才匹配。x(?!y)—负前瞻断言:匹配x,但仅当x后不跟y时才匹配。(?<=y)x—正前瞻assertionLookbehindassertion(zero-widthlookbehindassertion):Matchxonlyifprecedingedbyy.(?按数字反向引用:\N我们可以将两种引号放在方括号中:['"](.*?)['"],但它会找到带有混合引号的字符串像“...”和“...”。当一种引号出现在另一种引号中时,例如在字符串“She'stheone!”中,这会导致不正确的匹配:为了确保模式查找与开始引号完全相同的结束引号,我们可以替换Wrap它进入一个捕获组并反向引用它:(['"])(.*?)\1.letstr=`Hesaid:"She'stheone!".`;letregexp=/(['"])(.*?)\1/g;alert(str.match(regexp));//“就是她了!”正则表达式引擎将找到第一个引号(['"])并记录That'sthefirstcapturinggroup。模式中的\1表示“找到与第一组相同的文本”,在我们的示例中是完全相同的引号。类似地,\2表示第二组,\3-第三组,依此类推。请注意:如果我们在捕获组中使用?:,那么我们将无法引用它。使用(?:...)被排除在外,引擎不会记住它。按名称反向引用:\k如果正则表达式中有很多括号,给它们起个名字可以方便引用。要引用命名的捕获组,我们可以使用:\k。在下面的示例中,引用组名为?,因此反向引用为\k:letstr=`Hesaid:"She'stheone!".`;letregexp=/(?['"])(.*?)\k/g;alert(str.match(regexp));//"She'stheone!"Regexp-方法预览替换在驼峰格式的字符串中添加空格removeCc("camelCase");//=>shouldreturn'camelCase'思路分析:1.首先需要搜索匹配的大写字母,用[A-Z]匹配C2.然后在AddspacebeforeC,needtogetCtomakechangesweneedtousecapturingparentheses!捕获括号允许匹配一个值并记住它,以便以后使用它!使用捕获括号来记住匹配的大写字母`/([A-Z])/`之后用$1访问捕获的值,最后实现捕获括号?使用字符串的.replace()方法!我们插入'$1'作为第二个参数(注意引号必须是这里使用)方法2:replace()也可以指定一个函数作为第二个参数//方法1functionremoveCc(str){returnstr.replace(/([A-Z])/g,"$1");}//方法2functionremoveCc(str){returnstr.replace(/[A-Z]/g,(match)=>""+match);}//testconsole.log(removeCc("camelCase"));//'驼峰案例'console.log(removeCc("helloWorldItIsMe"));//将'helloWorldItIsMe'的首字母大写capitalize("camelcase");//=>应该返回'Camelcase'使用^命中第一个字母,使用[a-z]选择首字母小写functioncapitalize(str){returnstr.replace(/^[a-z]/g,(match)=>match.toUpperCase());}//testconsole.log(capitalize(“骆驼香烟盒”));//Camelcase'所有大写单词的首字母capitalizeAll("camelcase");//=>应该返回'CamelCase'functioncapitalizeAll(str){returnstr.replace(/\b[a-z]/g,(match)=>match.toUpperCase());}//testconsole.log(capitalizeAll(“骆驼香烟盒”));//CamelCase'指定测试手机号校验规则,手机号除以1211开头的11位数字有效checkType_phone("13520646171");//应该返回truecheckType_phone("11520646171");//应该返回falsecheckType_phone("123456");//应该返回falsefunctioncheckType_phone(str){return/^1(3|4|5|6|7|8|9)[0-9]{9}$/.test(str);}//测试控制台。日志(checkType_phone(“13520646171”));//trueconsole.log(checkType_phone("11520646171"));//falseconsole.log(checkType_phone("123456"));//falseMatch尝试提取乱码字符串中的中文和有效符号varstr=`?在接受磁控胶囊胃镜检查的3182名无症状体检人群中,共检出7例胃癌,即无症状人群胃癌检出率为2.2‰,而50岁以上人群胃癌检出率高达7.4‰!该研究成果发表于权威学术期刊GIEGastrointestinalEndoscopy,译名《消化内镜》)美国消化领域期刊?

`;functiongetChineseText(str){varreg=/[\u4e00-\u9fa5|0-9.\‰《》]+/g;returnstr.match(reg).join(",");}console.log(getChineseText(str));//接受磁控胶囊胃镜检查的3182名无症状人群中,共检出7例胃癌,也就是说无症状人群胃癌检出率为2.2‰,胃癌检出率在50岁以上人口中高达7.4‰。该研究成果发表在美国消化领域的权威学术期刊上。译名《消化内镜》匹配地址:varstr=`;rel="下一步",;rel="last"`;console.log(str.match(/<.+?>/g));/*['','']*/正则表达式全集参考链接,再也不怕乱做NLP时用字符串https://zh.javascript.info/https://juejin.cn/post/702167...https://github.com/veedrin/ho...《马蹄铁》专项学习计划正则表达式30分钟入门教程(第二版)实现一个简单的模板引擎【正则表达式系列】贪心和非贪心模式,bydailcJavaScript模板引擎原理,几行代码