JavaScript移除维基页面括号及内容失败,求解决方案
搞定正则括号匹配的坑:你的问题分析+解决方案
嘿,兄弟,看你遇到的这几个正则问题,明显是写法踩坑啦!咱们一个个掰扯清楚:
1. 用replace(/(.*)/g, '')得到空字符串
你写的这个正则/(.*)/g根本不是在匹配括号内容啊!它是直接匹配整个字符串:
.能匹配除换行外的任意字符,*表示可以匹配0次或多次,合起来.*就把从字符串开头到结尾的所有内容都吞掉了- 再加
g全局标志,直接把所有匹配到的内容(也就是整个文本)换成空,结果当然是空字符串咯。
你本来是想抓括号及里面的内容,肯定是漏了转义括号(括号在正则里是特殊字符,得用\转义成\(和\)),写法完全错了。
2. 去掉g标志后丢失文本开头部分
如果去掉g,/(.*)/只会匹配一次,但还是会匹配整个字符串,替换成空的话应该还是全空?哦,我猜你大概率是实际写正则的时候手滑,把/\(.*\)/写成了/(.*)/?要是用/\(.*\)/(没加非贪婪),那它会贪婪地从第一个(一直匹配到字符串最后一个字符(因为.*会尽可能多吞内容),比如你的示例文本是Norway ((list ...)) some text,替换后就只剩Norway ,看起来像是后面内容丢了,可能你搞反了描述?不管怎样,核心还是正则没写对。
3. 替换为“Red”时出现重复的RedRed
这个就有意思了!/(.*)/g会匹配两次内容:第一次匹配整个字符串,替换成Red;第二次会匹配字符串末尾的空字符(因为.*允许匹配0个字符),又替换成Red,所以最终就变成了RedRed。是不是恍然大悟?
正确解决:移除括号及内部内容的方案
根据维基页面的特点(可能有嵌套括号,比如(something (nested) here)),分两种情况给你方案:
情况1:无嵌套括号(比如Norway (list of cities))
用非贪婪匹配的正则,精准抓每一对括号:
const originalText = "Norway (list of municipalities)"; const cleanedText = originalText.replace(/\(.*?\)/g, ''); console.log(cleanedText); // 输出:Norway
\(:转义左括号,告诉正则这是普通字符.*?:非贪婪匹配,找到第一个\)就停止,不会过度匹配g:全局替换所有括号对
情况2:有嵌套括号(比如Norway ((list of cities in) Oslo))
JS正则不支持递归匹配嵌套结构,所以用循环处理最内层括号,直到所有括号都被移除:
let originalText = "Norway ((list of cities in) Oslo)"; while (originalText.includes('(')) { // 每次替换最内层的无嵌套括号对 originalText = originalText.replace(/\([^()]*\)/g, ''); } console.log(originalText); // 输出:Norway
\([^()]*\):匹配一对括号,里面的内容是不包含任何括号的字符,每次处理最内层,循环到没有括号为止
内容的提问来源于stack exchange,提问作者Herman Neple




