Строка Javascript соответствует определенному регулярному выражению - PullRequest
2 голосов
/ 13 мая 2019

Я хочу сопоставить конкретную строку из этой переменной.

var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';

Вот мое регулярное выражение:

var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';

var match_data = [];

match_data = string.match(/[0-9]+(?:((\s*\-\s*|\s*\*\s*)[0-9]+)*)\s*\=\s*[0-9]+(?:(\s*\+\s*[0-9]+(?:((\s*\-\s*|\s*\*\s*)[0-9]+)*)\s*=\s*[0-9]+)*)/g);

console.log(match_data);

Вывод покажет

[
   0: "150-50-30-20=50"
   1: "50-20-10-5=15+1*2*3*4=24+50-50*30*20=0"
   2: "2*4*8=64"
]

Результат, который я хочу сопоставить из переменной string, равен

 [
     0: "150-50-30-20=50"
     1: "1*2*3*4=24"
     2: "50-50*30*20=0"
 ]

Ответы [ 4 ]

2 голосов
/ 13 мая 2019

В соответствии с вашей входной строкой и ожидаемыми результатами в массиве, вы можете просто разделить вашу строку с помощью +, а затем отфильтровать строки, начинающиеся с skip, и получить нужные совпадения в вашем массиве.

const s = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64'
console.log(s.split(/\+/).filter(x => !x.startsWith("skip")))

Существуют и другие подобные подходы с использованием регулярных выражений, которые я могу предложить, но упомянутый выше подход с использованием split кажется простым и достаточно хорошим.

2 голосов
/ 13 мая 2019

Вы можете использовать ((?:\+|^)skip)? группу захвата перед (\d+(?:\s*[-*\/+]\s*\d+)*\s*=\s*\d+) в шаблоне, находить каждое совпадение и всякий раз, когда группа 1 не является неопределенной, пропустить (или пропустить) это совпадение, иначе захватить значение группы 2.

var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64', 
 reg = /((?:^|\+)skip)?(\d+(?:\s*[-*\/+]\s*\d+)*\s*=\s*\d+)/gi,
 match_data = [], 
 m;
while(m=reg.exec(string)) {
   if (!m[1]) {
      match_data.push(m[2]);
   }
}
console.log(match_data);

Обратите внимание, что я добавил в шаблон / и + операторов ([-*\/+]).

Regex details

  • ((?:^|\+)skip)? - Группа 1 (необязательно): 1 или 0 вхождений +skip или skip в начале строки
  • (\d+(?:\s*[-*\/+]\s*\d+)*\s*=\s*\d+) - Группа 2:
    • \d+ - 1+ цифр
    • (?:\s*[-*\/+]\s*\d+)* - ноль или более повторений
      • \s*[-*\/+]\s* - -, *, /,+ заключено в 0+ пробелов
      • \d+ - 1+ цифр
    • \s*=\s* - = заключено в 0+ пробелов
    • \d+ - 1+ цифр.
0 голосов
/ 13 мая 2019

const string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';
const stepOne = string.replace(/skip[^=]*=\d+./g, "")
const stepTwo = stepOne.replace(/\+$/, "")
const result = stepTwo.split("+")
console.log(result)
0 голосов
/ 13 мая 2019

попробуй

var t = string.split('+skip');
var tt= t[1].split('+');
var r = [t[0],tt[1],tt[2]]

var string = '150-50-30-20=50+skip50-20-10-5=15+1*2*3*4=24+50-50*30*20=0+skip2*4*8=64';

var t = string.split('+skip');
var tt= t[1].split('+');
var r = [t[0],tt[1],tt[2]]

console.log(r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...