Автоматически заменять аргумент в RegEx JavaScript - PullRequest
0 голосов
/ 01 мая 2019

У меня вопрос по поводу некоторых регулярных выражений.

Для контекста, я сейчас создаю пользовательские команды на боте 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]";

Приведенный выше пример не сработает в любом случае, если в theString есть даже один [ARG], он будет включать $0 $1 $2 в переменную CmdName, потому чтоtheString никогда не изменится.

В приведенном выше примере CmdName должно закончиться так, как bin [USER] $0 $1 [DESC].

Как я могу сделать это эффективно, возможно, также итерируя по нему?Ограничение использования [ARG] значениями до трех или четырех также будет полезно.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Я не совсем понимаю, что вы пытаетесь сделать, но регулярное выражение может быть не вашим другом здесь. Я бы предложил разделить вашу команду и пройтись по полученному массиву. Что-то в этом роде должно привести вас туда, куда вы пытаетесь пойти.

let theString = "bin [uSER] [arg] [DESc] [ARg]",
  stringSplit = theString.split(" "),
  cmd = stringSplit.shift(), //remove the command and store it
  arr = stringSplit.join(" ").toUpperCase().split(" ") //make the rest uppercase

let descIdx = arr.indexOf('[DESC]'),
  descStr = descIdx > -1 ? arr.splice(descIdx, 1) : "",
  userIdx = arr.indexOf('[USER]'),
  userStr = userIdx > -1 ? arr.splice(userIdx, 1) : ""
  
//now all that's left is the [ARG]s
let argStr = arr.map((arg, i) => ['$', i].join("")).join(" ")

//wrap it all up

let result = [cmd, userStr, argStr, descStr].join(" ")

console.log(result)
1 голос
/ 01 мая 2019

Вы можете использовать регулярное выражение \[(.*?)\], чтобы получить содержимое в пределах [] для группы захвата ( Regex demo ). Затем используйте замещающую функцию для обработки arg и других аргументов отдельно. Используйте argCounter для получения последовательных чисел $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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...