如何用正则表达式提取[device]与[/device]标签间的字符串?
解决提取
[device]标签内内容的正则问题 嘿,问题出在你没转义正则里的特殊字符!正则中[]是用来定义字符集合的,比如[abc]会匹配a、b、c中的任意一个字符,而不是完整的[abc]字符串。你之前写的[device]其实是在匹配d、e、v、i、c、e里的某一个字符,这当然取不到正确内容啦😅。
正确的正则写法
只需要把标签里的方括号用\转义,让正则把它们当成普通字符匹配就行:
单个匹配的情况
const str = "[device]Some device[/device]"; // 转义[],非贪婪匹配中间内容 const regex = /\[device\](.*?)\[\/device\]/i; const result = regex.exec(str); if (result) { console.log(result[1]); // 输出:Some device }
\[device\]:匹配字面量[device](.*?):非贪婪模式匹配中间的任意内容(避免匹配到多个标签时的内容溢出)\[\/device\]:匹配字面量[/device](在JS正则中,用/作为分隔符时,内部的/需要转义;也可以用RegExp构造函数,比如new RegExp("\\[device\\](.*?)\\[/device\\]", "i"))i:可选参数,忽略大小写匹配(如果你的标签大小写不固定的话启用)
多个匹配的情况(比如字符串里有多个[device]标签)
如果要提取所有符合条件的内容,加上g全局匹配标识,循环获取结果:
const text = "[][/] [device]Some device[/device] [device]Another device[/device]"; const regex = /\[device\](.*?)\[\/device\]/gi; let match; while ((match = regex.exec(text)) !== null) { console.log(match[1]); // 依次输出:Some device、Another device }
为啥之前的方案出错?
你提到的方案应该是针对没有特殊元字符的包裹字符串(比如用普通单词作为边界),而你的标签里含有[]这种正则特殊字符,必须转义后才能正确匹配字面量,否则正则会把[device]解析成字符集,导致匹配到错误的内容(比如你遇到的evice]Some device[/device,就是因为正则先匹配了[device]里的某个字符,然后把后面的内容都当成中间部分了)。
内容的提问来源于stack exchange,提问作者1110
相关产品推荐
相关产品推荐

