Регулярное выражение Javascript: динамическая группа захвата

77
9

Я пытаюсь впервые обдумать регулярное выражение.

Для строки

I want you to MATCH THIS, you bastard regex, but also MATCH X THIS and yeah,
MATCH X X X THIS too.

В принципе, начальный шаблон, шаблон конца и произвольное число шаблона между ними.

Поэтому я бы хотел, myregex.exec string последовательно возвращалась

["MATCH", "THIS"]
["MATCH", "X", "THIS"]
["MATCH", "X", "X", "X", "THIS"]

Я пробовал варианты этого

/(MATCH)\s+(X)?\s+(THIS)/

но нет сигары...

спросил(а) 2021-01-25T18:42:46+03:00 4 месяца, 4 недели назад
1
Решение
63

Вы можете использовать регулярное выражение для соответствия всему выражению:

/MATCH\s+(?:X\s+)*THIS/g

Чтобы получить его в массив терминов/слов, вы можете использовать String.split() следующим образом:

var out = document.getElementById( "out" );

function parse( string ){
var re = /MATCH\s+(?:X\s+)*THIS/g;
var matches = (string.match( re ) || [])
.map( function(m){ return m.split( /\s+/ ); } );
out.innerHTML = JSON.stringify( matches );
}

parse( document.getElementById( "in" ).value );

textarea { width: 100%; }
<textarea id="in" onchange="parse( this.value )">I want you to MATCH THIS, you bad regex, but also MATCH X THIS and yeah, MATCH X X X THIS too.</textarea>
<p id="out"/>

ответил(а) 2021-01-25T18:42:46+03:00 4 месяца, 4 недели назад
63

Попробуйте поместить \s+ в необязательную группу с помощью *:

/(MATCH)\s+(?:(X)\s)*(THIS)/g

Обратите внимание на модификатор g, чтобы получить все совпадения.

ответил(а) 2021-01-25T18:42:46+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема