Javascript 细化此正则表达式以捕获星号之间的封闭字符串,如**(str)**

Javascript 细化此正则表达式以捕获星号之间的封闭字符串,如**(str)**,javascript,regex,Javascript,Regex,我正在尝试将**之间的字符串加粗,如**hello**到hello。起初看起来很简单,但由于像***a**和**a***这样的情况,我不得不添加一些长模式。当前的正则表达式如下所示: \*\*((?:\*(?!\*)[^*]*)*([^*])*(?:[^*]*(?<!\*)\*)*)\*\* 具有替换功能的代码 const reBoldLine=/\*\*((?:\*(?!\*)[^*])*([^*])*(?:[^*])*(? 编辑:将冗长的解释替换为预期结果,因此,**a***应该变成

我正在尝试将**之间的字符串加粗,如
**hello**
hello
。起初看起来很简单,但由于像
***a**
**a***
这样的情况,我不得不添加一些长模式。当前的正则表达式如下所示:

\*\*((?:\*(?!\*)[^*]*)*([^*])*(?:[^*]*(?<!\*)\*)*)\*\*
具有替换功能的代码
const reBoldLine=/\*\*((?:\*(?!\*)[^*])*([^*])*(?:[^*])*(?

编辑:将冗长的解释替换为预期结果

,因此,
**a***
应该变成
a*
a*
?如果你能将你的案例和预期结果放在一个表格中,这将真正有助于理解你的问题我相信只是一个简单的
/\*\*(*)\*\*/
适用于大多数用例。
**ab***
的逻辑与处理
**a**b**
的方式冲突。@anubhava有一个很好的整体解决方案。我会在@anubhava的解决方案中添加(\w|\s)+以覆盖包含新行的字符串:
/\**(\w|s)+.+)\*\*/
**a** → <b>a</b>           : success
***a** → <b>*a</b>         : success
**a*** → <b>a*</b>         : success
**a*a** → <b>a*a</b>       : fail with the current regex
**a**a** → <b>a</b>a**     : success
const reBoldLine = /\*\*((?:\*(?!\*)[^*]*)*([^*])*(?:[^*]*(?<!\*)\*)*)\*\*/g;
const strs = [
  '**a**',
  '***a**',     
  '**a***',     
  '***a***',
  '**a*a**'
]

const replacer = function(match, ...args){
  if(match){
    return "<b>"+args[0]+"</b>"
  }else{
    return "undefined"
  }
}

for(let str of strs){
  console.log(str.replace(reBoldLine, replacer))
}