Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript正则表达式是否匹配嵌套方括号内的任何单词?_Javascript_Regex - Fatal编程技术网

JavaScript正则表达式是否匹配嵌套方括号内的任何单词?

JavaScript正则表达式是否匹配嵌套方括号内的任何单词?,javascript,regex,Javascript,Regex,我试图找到一种方法,使用正则表达式在方括号内使文本斜体,包括嵌套的方括号,但不包括方括号本身。到目前为止,我想到的最好的办法是: text = text.replace(/(\[+)([^\[\]]+)(]+)/g, '$1<span style="font-style: italic;">$2</span>$3'); 应解析为: [test1]test2([[readonly][optionality][argumentType]argumentName[=defau

我试图找到一种方法,使用正则表达式在方括号内使文本斜体,包括嵌套的方括号,但不包括方括号本身。到目前为止,我想到的最好的办法是:

text = text.replace(/(\[+)([^\[\]]+)(]+)/g, '$1<span style="font-style: italic;">$2</span>$3');
应解析为:

[test1]test2([[readonly][optionality][argumentType]argumentName[=defaultValue]]…)[test3]test4

但是,上述正则表达式产生:

[test1]test2([[readonly][optionality][argumentType]argumentName[=defaultValue]]…)[test3]test4


(使用文本
argumentName
normal而不是斜体)

一种方法是匹配每个括号组,并在替换回调中替换该组中的每个单词:

string.replace(/(\[(?:\[[^\]]*\]|[^\[\]]*)*\])/g, function (match) {
  return match.replace(/(\w+)/g, '*$1*');
});
示例代码段:

var string=“[test1]test2([[readonly][optionality][argumentType]argumentName[=defaultValue]]…)[test3]test4”;
var result=string.replace(/(\[(?:\[^\]]*\].[^\[\]]*)*\]/g,函数(匹配){
返回匹配项。替换(/(\w+)/g,*$1*);
});

document.body.textContent=结果
你不能用(仅仅)正则表达式来解决这个问题,你需要编写一个解析器。看看这个:这是一个解析器。但是这不也是让
argumentName
Unitalized吗?@torazaburo不,根据我上面提供的演示片段,它会返回:
[*test1*]test2([[[*readonly*][*optionality*][*argumentType*]*argumentName*[=*defaultValue*]]…)[*test3*]test4
。必须将内部替换替换为
([^\[\]+)
,而不是
(\w+
),但在其他方面效果很好。谢谢。@CoryG哦,好吧,我以为你只是想说几句话。不过,我很高兴听到这起作用了!事实上,我说得太快了,这对我来说不起作用。
string.replace(/(\[(?:\[[^\]]*\]|[^\[\]]*)*\])/g, function (match) {
  return match.replace(/(\w+)/g, '*$1*');
});