You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动