Как использовать выражение регулярного выражения для разделения строк на основе нескольких символов в выражении? - PullRequest
0 голосов
/ 02 октября 2019

Извините, если формулировка плохая. Поэтому я пытаюсь выяснить, как передать совпадение строк из нескольких символов в мое динамическое выражение регулярного выражения.

Регулярное выражение в моем операторе else работает с передачей 1 символа, поэтому я пытаюсьсделать то же самое, за исключением нескольких символов, передаваемых в первом операторе if.

const delimiter = str.slice(0, str.indexOf('\n'));
  const strLength = delimiter.length;
  if (delimiter[0] === '[' && delimiter.charAt(strLength - 1) === ']') {
    const customDelimiter = delimiter.slice(delimiter.indexOf(delimiter[1]), delimiter.indexOf(delimiter.charAt(strLength - 1)));
    console.log(customDelimiter) // => '***'
    const regex = new RegExp(`,|\\n|\\${customDelimiter}`,'g');
    return strArr = str.split(regex).filter(Boolean);
  } else {
    const firstChar = str.slice(0, 1); // => '*'
    const regex = new RegExp(`,|\\n|\\${firstChar}`,'g');
    return strArr = str.split(regex).filter(Boolean);
  }

Так, например, я хочу эту строку: '[*] \ n11 *** 22 *** 33«равный 66 б / с, следует разбить его на массив [11, 22, 33], используя разделитель« * ». Я получаю сообщение об ошибке: «SyntaxError: Недопустимое регулярное выражение: /, | \ n | *** /: Ничего не повторяется».

1 Ответ

2 голосов
/ 02 октября 2019

Когда вы используете * в качестве разделителя в своем регулярном выражении, оно становится ,|\\n|\\|\*, что является правильным регулярным выражением. Он соответствует символу ',' или '\ n' или символу '*'. Для вашей строки она соответствует [***] \n 11 *** 22 * ​​1006 * 33.

Но когда вы используете *** в качестве разделителя в своем регулярном выражении, оно становится ,|\\n|\\|\***,что неверно. Здесь он получает два не спасенных * в конце. * в регулярном выражении означает 0 или более из предыдущего шаблона. Вы не можете иметь два из них вместе.

Это особый случай, потому что * имеет особое значение в регулярном выражении. Если бы вы использовали любой не-регулярный символ, он бы работал.

Более простое решение - использовать функцию разделения javascript, чтобы легко получить желаемый результат. Сначала вы можете разделить строку, используя \n.

let splitStr = str.split('\n');
// This would return ["[***]", "11***22***33"]

, а затем разделить 1-й индекс splitStr, используя разделитель.

splitStr[1].split('***');
// splitStr[1].split(customDelimiter)
// This would return ["11", "22", "33"]

При использовании этого вам не нужноиспользуйте оператор if или else для разделения разделителя из одного символа и разделителя из нескольких символов.

...