我该如何使用正则表达式将字符串分成两个括号?

时间:2019-04-27 14:01:32

标签: javascript node.js regex discord.js

我一直在使用Discord.js和Node开发一个快速的bot来查找内容。我需要一种方法来查找出现在两个方括号之间的所有事件,并将它们存储在字符串数组中。目前,我正在将string-split()与一些正则表达式一起使用,但是我不确定要使用的正则表达式。

我尝试使用几种不同的括号,包括/[^\[\[]+(?=\]\])/g\[\[(.*?)\]\]-我不介意在结果中包含实际的括号,可以使用string.replace()手动将其删除。

我还在使用普通的string.split()和其他字符串函数进行后备工作,而不依赖于正则表达式,但是我仍然对可能的正则表达式版本感到好奇。

第一个正则表达式的结果完全不正确。例如,如果我尝试"does [[this]] work [at all]?"的输出是“ [[]]”和“ [atall]”,那么当它实际上不应该使用“ at”时,却应该显示“ [[this ]]”。

在第二个正则表达式中,我稍微靠近一点,它会返回“ this”(正确)和“ [at all]”(再次,它不应使用“ all”)。

我不介意在输出中包含方括号,我可以自己手动将其删除,但是我需要找到所有出现在两个方括号之间的事件。

2 个答案:

答案 0 :(得分:0)

尝试此正则表达式:

\[\[([^[\]]|(?R))*\]\]

您尝试做的事情称为Matching Balanced Constructs。链接中的更多信息。

不幸的是,在进一步测试中,JS不支持(?R),因此这变得更加困难。您可以使用XRegExp.matchRecursive软件包中的XRegExp插件。

您的表达式\[\[(.*?)\]\]应该起作用。下面的工作示例。

var str = 'does [[this]] work [at all] with another double [[here]]?';

var result = str.match(/\[\[(.*?)\]\]/g);

var newDiv = document.createElement("div"); 
newDiv.innerHTML = result;
document.body.appendChild(newDiv);

答案 1 :(得分:0)

尝试我的解决方案

var str = "does [[this]] work [at all]?";
var regexp = /\[([a-z0-9\s]+)\]/ig;

var resultArray = str.match(regexp); 
resultArray = resultArray.map((item) => {
  return item.replace(/(\[|\])/g, "");
})

console.log(resultArray);