Группы без захвата и захвата - правильный путь - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь сопоставить массив элементов, которым предшествует определенная строка в строке текста.Например, сопоставьте всех домашних животных в тексте ниже:

фрукты: яблоко, банан; домашние животные: кошка, собака, птица ; цвета: зеленый,синий

/(?:pets:)(\w+[,|;])+/g**

Используя данное регулярное выражение, я могу сопоставить только последнее слово "птица"

Может ли кто-нибудь помочь мне понять правильный способ использованияГруппы без захвата и захвата?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Поскольку вы хотите, чтобы каждый питомец находился в отдельном матче, и вы используете PCRE, \G, как предлагает Wiktor, является достойным вариантом:

(?:pets:)|\G(?!^)(\w+)(?:[,;]|$)

Объяснение:

  • 1-я альтернатива (?:pets:) для поиска начала шаблона
  • 2-я альтернатива \G(?!^)(\w+)(?:[,;]|$)
    • \G устанавливает позицию в конце предыдущего совпадения или в начале строкиза первый матч
    • Negative Lookahead (?! ^), чтобы утверждать, что регулярное выражение не совпадает в начале строки
    • (\w+) с совпадениями с домашними животными
    • Группа без захвата (?:[,;]|$), используемая в качестве разделителя (соответствует одному символу в списке ,; (с учетом регистра) или $, устанавливает позицию в конце строки

Пример кода Perl:

use strict;
use Data::Dumper;

my $str = 'fruits:apple,banana;pets:cat,dog,bird;colors:green,blue';
my $regex = qr/(?:pets:)|\G(?!^)(\w+)(?:[,;]|$)/mp;
my @result = ();

while ( $str =~ /$regex/g ) {
    if ($1 ne '') {
        #print "$1\n";
        push @result, $1;
    }
}
print Dumper(\@result);
0 голосов
/ 28 мая 2018

Во-первых, давайте поговорим о группе захвата и захвата:

  • (?: ...) версия без захвата, вы ищете эти значения, но они вам не нужны
  • () захват версии, вы хотите, чтобы эти значения!Вы ищете его

Итак:

(?: pets :) вы ищете "домашние животные", но не хотите его захватывать, после этого вы ХОТИТЕчтобы захватить (если я понял):

Так что попробуйте (?: pets:) ([a-zA-Z,] +);... Вы ищете "домашние животные" (но не хотите этого!) И останавливаетесь на первом ";"(и не хочу этого тоже).

Результат: Матч 1: кошка, собака, птица

Лучшее решение существует с 1 совпадением == 1 питомцем.

...