js正则表达式

replace

match

match
matchAll
replace
search
split

g i m

  • g 表示全文匹配
  • i 表示匹配时忽略大小写
  • m 表示多行匹配
  • 如果多个条件同时使用时,则写成:gim

()、[]、{}

  • () 的作用是提取匹配的字符串,表达式中有几个()就会得到几个相应的匹配字符串。比如 (\s+) 表示连续空格的字符串。
  • [] 查找方括号之间的任何字符,是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示字符文本要匹配英文字符和数字。
  • {}一般用来表示匹配的长度,比如 \d{3} 表示匹配三个空格,\d[1,3]表示匹配1~3个空格。

^ 和 $

  • ^ 匹配一个字符串的开头,比如 (^a) 就是匹配以字母a开头的字符串
  • ^ 还有另个一个作用就是取反,比如[^xyz] 表示匹配的字符串不包含xyz
  • $ 匹配一个字符串的结尾,比如 (b$) 就是匹配以字母b结尾的字符串

需要注意的是:如果^出现在[]中一般表示取反,而出现在其他地方则是匹配字符串的开头

\d \s \w \n .

  • \d 匹配一个非负整数, 等价于 [0-9]
  • \s 匹配一个空白字符
  • \w 匹配一个数字、字母及下划线,等价于 [0-9a-zA-Z_]
  • \n 匹配换行符
  • . 匹配除换行符以外的任意字符,等价于 [^\n]

* + ?

  • * 表示匹配前面元素0次或多次,比如 (\s*) 就是匹配0个或多个空格
  • + 表示匹配前面元素1次或多次,比如 (\d+) 就是匹配由至少1个整数组成的字符串
  • ? 表示匹配前面元素0次或1次,相当于 {0,1} ,比如 (\w?) 就是匹配最多由1个字母或数字组成的字符串

支持正则表达式的 String 对象的方法

replace

str.replace(regexp|substr, newSubStr|function)  

当第二个参数是函数时,这个函数会在每次匹配发生时被调用,函数的返回值将被用作替换字符串。

var str = "Visit Microsoft! Microsoft is a company.";  
var res = str.replace(/Microsoft/g, function(match) {  
  return match.toUpperCase();  
});  
console.log(res); // "Visit MICROSOFT! MICROSOFT is a company."  
函数参数

当使用函数作为 replace() 方法的第二个参数时,这个函数可以接收若干个参数:

  • match:匹配的全字符串。
  • p1, p2, ...:如果正则表达式中包含括号分组(捕获组),那么每个括号中的匹配字符串将作为参数传递给这个函数。
  • offset:匹配到的子字符串在原字符串中的偏移量(即匹配到的字符串的起始索引)。
  • string:被匹配检索的原字符串。
  • groups:一个包含所有命名捕获组的对象(如果使用了命名捕获组)。
var originalString = 'John Smith';  
var newString = originalString.replace(/(\w+) (\w+)/, function(match, p1, p2, offset, string) {  
        console.log('match=',match)  //match= John Smith
        console.log('p1=',p1)  //p1= John
        console.log('p2=',p2)  //p2= Smith
        console.log('offset=',offset)  //offset= 0
        console.log('string=',string)  //string= John Smith
        return [p1, p2].join(' - '); // 返回值将替换掉原始的匹配项  
});  
console.log(newString); // 输出: "John - Smith"  

在这个例子中,正则表达式 (\w+) (\w+) 匹配了 "John Smith" 中的两个单词,并将它们作为两个分组传递给 replacer 函数。函数接收这些分组作为 p1 和 p2,然后返回一个新的字符串 "John - Smith",这个字符串将替换原始的匹配项。

利用函数进行复杂替换

使用函数作为 replace() 的第二个参数非常有用,特别是当你需要对匹配项进行一些复杂处理时。比如,你可以根据匹配的内容进行条件判断,或者利用匹配项的位置信息来决定如何替换。

var text = "The quick brown fox jumps over the lazy dog.";  
var newText = text.replace(/[aeiou]/g, function(match, offset) {  
  return offset + ":" + match.toUpperCase();  
});  
console.log(newText);  
// Th2:E q5:U6:Ick br12:Own f17:Ox j21:Umps 26:Ov28:Er th33:E l36:Azy d41:Og.

在这个例子中,正则表达式 [aeiou] 匹配了文本中的所有元音字母,并且通过提供的函数将每个元音字母做了相应的替换

假设我们有一个字符串,想要将里面的数字增加一,可以利用 replace() 方法和一个函数来实现:

const str = '在2023年,我希望我的代码错误少一点。';  
const newStr = str.replace(/\d+/g, (match) => {  
  // 将匹配到的数字字符串转换成数字,增加1,然后转回字符串  
  return parseInt(match, 10) + 1;  
});  
  
console.log(newStr);  
// 输出:在2024年,我希望我的代码错误少一点。  

在这个例子中,正则表达式 \d+ 匹配字符串中的所有数字序列。对于每个匹配,replace() 调用提供的函数,将匹配的字符串(如 "2023")作为 match 参数传递给这个函数。函数解析这个字符串为数字,将其加一,然后返回这个新值的字符串表示,这个返回值随后用于替换原来的匹配部分。

使用括号捕获组

当正则表达式中包含括号捕获组时,这些组匹配的字符串也会作为参数传递给函数:

const str = '我在2023年写了1000行代码。';  
const newStr = str.replace(/(\d+)年写了(\d+)行代码/, (match, year, lines) => {  
  return `我在${parseInt(year, 10) + 1}年写了${parseInt(lines, 10) + 500}行代码`;  
});  
  
console.log(newStr);  
// 输出:我在2024年写了1500行代码。  

这个例子展示了如何使用捕获组和函数参数来实现更复杂的替换逻辑。正则表达式 (\d+)年写了(\d+)行代码 匹配一个年份和一个数字,这些数字分别表示年份和代码行数。在替换函数中,通过参数 year 和 lines 接收这些匹配的数字字符串

replace 特殊替换模式

在 JavaScript 的 replace() 方法中,除了可以使用字符串或函数作为替换参数之外,还可以使用一些特殊的替换模式。这些模式在使用字符串作为替换参数时非常有用,因为它们提供了一种方式来插入特定的匹配信息到替换字符串中。以下是一些常用的特殊替换模式:

  1. $&
    插入整个匹配的子串。例如:
'The cat sat on the mat'.replace(/cat/, '($&)') // "The (cat) sat on the mat"  
  1. `$``
    插入当前匹配的子串左边的内容。例如:
'The cat sat on the mat'.replace(/cat/, '$`') // "The The  sat on the mat"  
  1. $'
    插入当前匹配的子串右边的内容。例如:
'The cat sat on the mat'.replace(/cat/, "$'") // "The  sat on the mat sat on the mat"  
  1. $n
    其中 n 是从1到99的数字,表示第n个括号匹配的子串。例如:
'The cat sat on the mat'.replace(/(c)(a)t/, '$2$1') // "The ac sat on the mat"  

如果正则表达式中有括号(即捕获组),1、2等可以用来引用第1、第2等捕获组匹配的文本。

  1. $$
    插入一个$符号。例如:
'The cat sat on the mat'.replace(/cat/, '$$') // "The $ sat on the mat"  

这些特殊替换模式使得 replace() 方法在进行字符串替换时更加灵活和强大。它们可以用来动态地构造替换字符串,根据匹配的上下文来调整替换结果。

match()

JavaScript 中的 match() 方法是用于在字符串中查找匹配正则表达式的内容。这个方法返回匹配到的结果作为一个数组,或者当没有找到匹配时返回 null。match() 方法对于字符串的解析和数据提取非常有用。

语法 str.match(regexp)
  • str: 要进行搜索的字符串。
  • regexp: 一个正则表达式对象。如果传入的是一个非正则表达式对象,则会隐式地使用 new RegExp(obj) 将其转换为正则表达式对象。
    返回值
  • 如果使用了全局搜索标志(g),match() 方法会返回一个数组,其中包含所有匹配的整个字符串,而不会返回捕获组。
  • 如果没有使用全局搜索标志,match() 返回的数组包含了第一个完整匹配及其相关的捕获组(如果有的话)。在这种情况下,返回的数组还拥有额外的属性:index 和 input:
    index 表示匹配项在字符串中的开始位置。
    input 是进行匹配搜索的初始字符串。
使用全局标志
var text = "The rain in SPAIN stays mainly in the plain";  
var result = text.match(/ain/g);  
console.log(result); // 输出: ["ain", "ain", "ain"]  
不使用全局标志
var text = "The rain in SPAIN stays mainly in the plain";  
var result = text.match(/ain/);  
console.log(result);  
// 输出: ["ain", index: 5, input: "The rain in SPAIN stays mainly in the plain", groups: undefined]  
使用捕获组
var text = "The rain in SPAIN stays mainly in the plain";  
var result = text.match(/(ai)n/);  
console.log(result);  
// 输出: ["ain", "ai", index: 5, input: "The rain in SPAIN stays mainly in the plain", groups: undefined]  

在这个例子中,正则表达式 (ai)n 匹配 "ain",并且有一个捕获组 ai。返回的数组中,第一个元素是整个匹配的字符串 "ain",第二个元素是第一个捕获组匹配的 "ai"。

注意事项

如果正则表达式包含一个或多个捕获组,并且使用了全局标志 g,那么返回的数组不会包含捕获组的匹配,只包含整个正则表达式的匹配。如果你需要捕获组的信息,可以使用 RegExp.exec() 方法在一个循环中逐个处理匹配。
如果 match() 方法的参数不是一个正则表达式对象,那么会将其转换为一个正则表达式对象。

match() 方法是处理字符串和正则表达式匹配的强大工具,可以用来进行复杂的文本分析和数据提取。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容