首页 > 解决方案 > 自动替换 RegEx JavaScript 中的参数

问题描述

我对一些正则表达式有疑问。

对于上下文,我目前正在 Discord 机器人上创建自定义命令。我需要重新排列命令中的参数。

我这里有这个字符串 -bin [user] [aRG] [arg] [DEsc]并且需要像这样安排它 - bin [USER] $0 $1 [DESC]。我还需要使它不区分大小写。

我试图在每一个可能的情况下创建 IF 语句。但我还需要记住的是,如果[DESC]先出现然后是论点,我需要重新安排它。这就是我所拥有的——

let theString = "bin [uSER] [arg] [DESc] [ARg]";
let CmdName   = theString.split(" ")[0].toLowerCase();

if (theString.includes(/\[user\]/i)) CmdName += " [USER]";
if (theString.includes(/\[arg\]/i))  CmdName += " $0";
if (theString.includes(/\[arg\]/i))  CmdName += " $1";
if (theString.includes(/\[arg\]/i))  CmdName += " $2";
if (theString.includes(/\[desc\]/i)) CmdName += " [DESC]";

上面的例子无论如何都行不通,如果 甚至有一个[ARG]in theString,它将包含$0 $1 $2CmdName变量中,因为它theString永远不会改变。

在上面的例子中,CmdName最终需要像bin [USER] $0 $1 [DESC].

我怎样才能有效地做到这一点,也可能迭代它?将值使用限制[ARG]为三个或四个也很方便。

标签: javascriptregex

解决方案


您可以使用正则表达式\[(.*?)\]将内容获取[]到捕获组(正则表达式演示)。然后使用替换函数分别处理 forarg和其他参数。使用 anargCounter获取连续数字$0$1

let str = "bin [user] [aRG] [arg] [DEsc]",
    argCounter = 0;

const newStr = str.replace(/\[(.*?)\]/g,
  (m, p1) => {
    if (p1.toUpperCase() === 'ARG')
      return `$${argCounter++}`
    else
      return `[${p1.toUpperCase()}]`
  })

console.log(newStr)


推荐阅读