Как количественно оценить группу в регулярном выражении Javascript?

Допустим, у меня есть строка «QQxaxbxcQQ», и я хотел захватить все группы x, за которыми следует любой символ. Я также хочу искать только между QQ (строка может включать в себя другие вещи). Я предполагал, что это сработает:

var matches = str.match(/QQ(x\w)+QQ/)

Однако это только возвращает мне последний матч (xc). Можете ли вы указать мне правильное направление?

РЕДАКТИРОВАТЬ: первая версия моего вопроса была упрощена. Извиняюсь перед первоначальными ответчиками. Отредактировано, чтобы сделать его ближе к моей реальной проблеме.


person user200814    schedule 30.11.2012    source источник


Ответы (5)


Оператор + жадный. /(x\w)+/ должно соответствовать всей строке 'xaxbxc', а группа захвата будет содержать окончательное значение, соответствующее компоненту (x\w). В данном случае 'xc'. Если вы хотите захватить каждое последующее совпадение, вместо /(x\w)+/ должно быть /((?:x\w)+)/. Это перемещает группу захвата вокруг последовательности, а не внутри нее. (?: ) представляет группу без захвата.

РЕДАКТИРОВАТЬ:

Если вам нужен каждый экземпляр (x\w), а не только последовательные экземпляры, не используйте оператор + или группы захвата. Просто используйте глобальное регулярное выражение: /x\w/g.

'QQxaxbQQxcQQ'.match(/x\w/g) дает ['xa, 'xb', 'xc'].

'QQxaxbQQxcQQ'.match(/((?:x\w)+)/) дает ['xaxb', 'xaxb'].

РЕДАКТИРОВАТЬ 2:

Если вы хотите искать только между QQs, split должен быть самым быстрым методом. (Здесь очень помогает подчеркивание.)

_.chain('xyQQxaxbQQxcQQxr'.split('QQ'))
.slice(1, -1)
.map(function (string) {
    return string.match(/x\w/g);
})
.flatten()
.compact()
.value()

дает ['xa', 'xb', 'xc']

person Keen    schedule 30.11.2012

Вам нужно только добавить параметр g в конце вашего регулярного выражения. Флаг g возвращает массив, содержащий все совпадения, в нашем случае все совпадения обратной ссылки (x\w)

Здесь жирным шрифтом: /QQ(x\w)+QQ/g

var matches = str.match(/QQ(x\w)+QQ/g)

совпадения - это массив

посмотрите на это: http://jsfiddle.net/SZRSA/3/

person freedev    schedule 30.11.2012
comment
Скажите, что он возвращает? - person John Dvorak; 30.11.2012
comment
это массив. Кстати, ваш вопрос прибыл до моего обновления :) - person freedev; 30.11.2012

'xaxbxc'.match(/x\w/g);

который возвращает

["xa", "xb", "xc"]

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

person xiaoyi    schedule 30.11.2012

Возможно, вам нужно обернуть повторение в группу захвата (захват всех экземпляров x\w, объединенных вместе):

var matches = str.match(/QQ((x\w)+)QQ/)

Это возвращает "xaxbxc" как matches[1]

person John Dvorak    schedule 30.11.2012

Если вы хотите захватить все группы, используйте это:

var matches = str.match(/(x\w)/g)

выход :

["xa", "xb", "xc"]

Я сделал два изменения:

  • удалил +, так как вы, кажется, хотите, чтобы каждый x сопровождался одним символом
  • добавлен модификатор g для запроса всех групп

Справочник


РЕДАКТИРОВАТЬ: если вы хотите получить свои совпадения только тогда, когда они находятся между QQ и QQ, вы можете сделать это:

var matches = str.split('QQ').filter(function(v,i){return i%2})
    .join(' ').match(/(x\w)/g)
person Denys Séguret    schedule 30.11.2012
comment
Извините, я понял, что упростил свой вопрос. Я отредактировал, можно еще раз посмотреть? - person user200814; 30.11.2012
comment
@user200814 user200814 Я не уверен, что понимаю, почему мой ответ вам не подходит. Разве это не дает то, что вы хотите? - person Denys Séguret; 30.11.2012