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

正则注释——Methods

时间:2023-03-27 17:45:19 JavaScript

Methods,JavaScript中操作正则的方法有哪些。RegExp对象方法方法说明exec检索字符串中指定的值。返回找到的值并确定其位置。测试检索字符串中指定的值。返回真或假。regexp.test(string)regexp.test(str)方法regexp.test(str)查找匹配项,然后返回true/false以判断是否存在。letstr="IloveJavaScript";//两个测试是一样的console.log(/love/i.test(str));//trueconsole.log(str.search(/love/i)!=-1);//trueregexp.exec(str)regexp.exec(str)方法返回字符串str中的正则表达式匹配,可以指定从位置开始查找。根据是否有修饰符g,它有两种搜索模式。(1)没有修饰符g,regexp.exec(str)返回第一个匹配项,就像str.match(regexp)一样。这种行为不会带来任何新的东西。letstr="更多关于JavaScript的信息在https://javascript.info";letregexp=/javascript/i;console.log(regexp.exec(str));/*[0:"JavaScript"groups:undefinedindex:11input:"有关JavaScript的更多信息,请访问https://javascript.info"]*/(2)使用修饰符g,您可以根据regexp.lastIndex位置搜索所有内容。详细步骤:调用regexp.exec(str)返回第一个匹配项并将紧随其后的位置保存在属性regexp.lastIndex中。下一个这样的调用在regexp.lastIndex位置开始搜索,返回下一个匹配项,并将此后的位置保存在regexp.lastIndex中。...等等。如果没有匹配项,则regexp.exec返回null并将regexp.lastIndex重置为0。因此,重复调用会一个接一个地返回所有匹配项,使用属性regexp.lastIndex来跟踪当前搜索位置。过去,在将str.matchAll方法添加到JavaScript之前,会在循环中调用regexp.exec以获取组的所有匹配项:letstr="MoreaboutJavaScriptathttps://javascript.info";letregexp=/javascript/gi;letresult;while((result=regexp.exec(str))){console.log(`Found${result[0]}atposition${result.index}`);//在位置11找到JavaScript,然后//在位置33找到javascript}这现在也有效,尽管str.matchAll对于较新的浏览器通常更方便。指定位置搜索我们可以手动设置lastIndex并使用regexp.exec从给定位置搜索。例如:letstr="Hello,world!";letregexp=/\w+/g;//如果没有修饰符“g”,lastIndex属性将被忽略regexp.lastIndex=5;//从第5个位置开始搜索(以逗号开头)console.log(regexp.exec(str));//world如果正则表达式有修饰符y,搜索将精确地在regexp.lastIndex处执行,不再进一步。让我们用y替换上面示例中的g修饰符。现在找不到匹配项,因为位置5没有单词:letstr="Hello,world!";letregexp=/\w+/y;regexp.lastIndex=5;//精确搜索位置5console.log(regexp.exec(str));//null当我们需要通过正则表达式在确切位置而不是在它之后的某处从字符串中“读取”某些内容时,这很方便。String对象的方法str.match(regexp)str.match(regexp)方法在字符串str中查找regexp的匹配项。查找成功则以数组形式返回内容,查找失败则返回null。它有三种模式:非全局匹配,不带g,返回第一个匹配,包括捕获组和属性indexletstr="2022/10/24";letresult=str.match(/(\d{4})\/(\d{2})\/(\d{2})/);//第一个是精确匹配console.log(result[0]);//2022/10/24(Exactmatch)//捕获组的结果从第二项开始显示,如果没有捕获内容,则显示undefinedconsole.log(result[1]);//"2022"(第一组)console.log(result[2]);//"10"(第一组)console.log(result[3]);//"24"(第一组)console.log(result.length);//4//其他属性:console.log(result.index);//0(匹配位置)console.log(result.input);//'2022/10/24'(sourcestring)//groups属性存储的不是捕获组信息,而是捕获命名信息(自定义捕获组名时有效)。console.log(result.groups);//undefined//非捕获组不会捕获console.log("2022/10/24".match(/(?:\d{4})\/(\d{2})\/(\d{2})/));//['2022/10/24','10','24',index:0,input:'2022/10/24',groups:undefined]全局匹配g,返回一个数组匹配,但没有捕获组和其他详细信息"2022/10/24".match(/(?:\d{4})\/(\d{2})\/(\d{2})/g);//['2022/10/24']"2022/10/24".match(/(\d{4})\/(\d{2})\/(\d{2})/g);//没有匹配到['2022/10/24'],所以不管修饰符gnull都会返回。"2022/10/24".匹配(/(\d{6})/);//nullletresult="2022/10/24".match(/(\d{6})/)||[];//期望结果是一个数组console.log(result);//[]str.matchAll(regexp)注意:这是最近添加到JavaScript的功能。较旧的浏览器可能需要polyfill。方法str.matchAll(regexp)是str.match的“更新、改进”变体。它主要用于搜索所有组的所有匹配项。与match相比有3个不同:它返回一个包含匹配项的可迭代对象,而不是数组。我们可以使用Array.from将其转换为常规数组。每个匹配项都作为捕获组数组返回(返回格式与不带g修饰符的str.match相同)。如果没有结果,则返回一个空的可迭代对象而不是null。让matchAll="2022/10/24".matchAll(/(\d{4})\/(\d{2})\/(\d{2})/g);console.log(matchAll);//[objectRegExpStringIterator],不是数组,而是可迭代对象matchAll=Array.from(matchAll);//现在它是一个数组//[0:['2022/10/24','2022','10','24',index:0,input:'2022/10/24',groups:undefined]]letfirstMatch=matchAll[0];console.log(firstMatch[0]);//'2022/10/24'console.log(firstMatch[1]);//2022console.log(firstMatch[2]);//10console.log(firstMatch[3]);//24console.log(firstMatch.index);//0console.log(firstMatch.input);//2022/10/24如果我们使用for..of来迭代matchAll匹配项,那么我们就不需要Array.from。str.split(regexp|substr,limit)使用正则表达式(或子字符串)作为分隔符来拆分字符串。我们可以像这样使用split来拆分字符串:const[y,m,d]="2022/10/24".split("/");console.log([m,d,y].join("/"));//10/24/2022但是同样,我们也可以使用正则表达式:console.log("2022,10,24".split(/,\s*/));//['2022','10','24']另外,因为split方法中的正则表达式是用来匹配分隔符的,所以全局匹配是没有意义的。str..search(/ink/i));//10(第一个匹配位置)重要限制:搜索只找到第一个匹配。如果我们需要其他匹配的位置,我们应该使用其他方法,例如str.matchAll(regexp)来查找所有位置。str.replace(str|regexp,str|func)这是一种用于搜索和替换的通用方法,也是最有用的方法之一。它是搜索和替换字符串的瑞士军刀。我们可以使用它来搜索和替换子字符串,而无需使用正则表达式。当replace的第一个参数是一个字符串时,它只替换第一个出现的地方。见下例:只有第一个“/”被替换为“-”。//将/字符替换为-console.log("2022/10/24".replace("/","-"));//2022-10/24//类似于正则匹配控制台。日志("2022/10/24".replace(/\//,"-"));//2022-10/24要查找所有连字符,我们不应该使用字符串“/”,而是使用带有g修饰符的正则表达式/\//g://将所有/字符替换为-console.log("2022/10/24".replace(/\//g,"-"));//2022-10-24第二个参数是替换字符串。我们可以在其中使用特殊字符,replace的内部逻辑会在实际替换时自动解析字符串并提取变量。符号替换字符串中的行$&插入整个匹配$`插入匹配之前的字符串部分$'插入匹配之后的部分字符串$n如果n是1-2位数字,则插入第n组的内容,详见捕获组$,以给定名称插入括号中的内容,详见捕获组$$插入字符$,例如:$&表示匹配结果。console.log("2022/10/24".replace(/(\d{4}\/\d{2}\/\d{2})/g,"今天是$&")//今天是2022/10/24);$`代表匹配结果左边的文字。console.log("今天是2022/10/24".replace(/(\d{4}\/\d{2}\/\d{2})/g,"$`")//今天是今天是);$n表示根据序号n获取对应捕获组的文本。//替换字符串console.log("2022/10/24".replace(/(\d{4})\/(\d{2})\/(\d{2})/g,"$2/$3/$1")//10/24/2022);//命名捕获组console.log("2022/10/24".replace(/(?\d{4})\/(?\d{2})\/(?\d{2})/g,"$/$/$"));//10/24/2022$表示按名称命名捕获组://命名捕获组console.log("2022/10/24".replace(/(?\d{4})\/(?\d{2})\/(?\d{2})/g,"$/$/$"));//10/24/2022对于需要“智能”替换的场景,第二个参数可以是函数。每次匹配都会调用此函数,返回值将作为替换字符串插入。调用函数func(match,p1,p2,...,pn,offset,input,groups)时使用参数:match-match,p1,p2,...,pn-捕获组的内容(如果有的话),offset-匹配的位置,input-源字符串,groups-具有命名捕获组的对象。如果正则表达式中没有括号,则只有3个参数:func(str,offset,input)。让结果="2022/10/24".replace(/(\d{4})\/(\d{2})\/(\d{2})/g,(_,y,m,d)=>{返回[m,d,y].join("/");});控制台日志(结果);//10/24/2022如果有很多组,rest参数(...)可以很容易访问:letresult="2022/10/24".replace(/(\d{4})\/(\d{2})\/(\d{2})/g,(...match)=>{return`${match[2]}/${match[3]}/${match[1]}`;});控制台日志(结果);//10/24/2022or,如果我们使用命名组,它们的组对象总是最后一个对象,所以我们可以这样得到它:letresult="2022/10/24".replace(/(?\d{4})\/(?\d{2})\/(?\d{2})/g,(...match)=>{让组=match.pop();返回`${groups.month}/${groups.day}/${groups.year}`;});控制台日志(结果);//10/24/2022str.replaceAll(str|regexp,str|func)这个方法本质上和str.replace是一样的,但是有两个主要区别:如果第一个参数是一个字符串,它将替换所有出现的与第一个参数相同的字符串,而replace只会替换第一个。如果第一个参数是不带修饰符g的正则表达式,则会报错。使用修饰符g时,它的作用与替换相同。replaceAll的主要目的是替换所有出现的字符串。像这样://用冒号替换所有破折号console.log("2022/10/24".replaceAll("/","-"));//2022-10-24RegExp.$1-$9非标准:这个特性是非标准的,尽量不要在生产中使用!非标准的$1、$2、$3、$4、$5、$6、$7、$8、$9属性是包含带括号的子字符串匹配的正则表达式的静态和只读属性。在脚本中使用replace、test、match等方法。如果正则表达式中包含捕获组,则访问RegExp对象的非标准属性$1和$2,提取捕获组中的内容。letstr="IloveJavaScript";console.log(/(love)/i.test(str));//RegExp.$1love参考链接https://zh.javascript.info/re...https://github.com/veedrin/ho...《马蹄铁》专题学习计划https://developer.mozilla.org...