Jak mogę usunąć przechwytywanie z dowolnie zagnieżdżonych podgrup w ciągu regex Perla? Chciałbym zagnieździć dowolny regex w wyrażeniu otaczającym, które przechwytuje podregex jako całość, a także statycznie znane kolejne grupy. Czy muszę przekształcić ciąg regex ręcznie na wszystkie grupy nie przechwytujące (?:)
(i mam nadzieję, że nie zepsuć), czy istnieje mechanizm regex lub biblioteka Perl, który zapewnia to?Jak utworzyć dowolne wyrażenie regularne Perla w całości nie przechwytujące? (Odpowiedź: Nie możesz)
# How do I 'flatten' $regex to protect $2 and $3?
# Searching 'ABCfooDE' for 'foo' OK, but '((B|(C))fo(o)?(?:D|d)?)', etc., breaks.
# I.E., how would I turn it effectively into '(?:(?:B|(?:C))fo(?:o)?(?:D|d)?)'?
sub check {
my($line, $regex) = @_;
if ($line =~ /(^.*)($regex)(.*$)/) {
print "<", $1, "><", $2, "><", $3, ">\n";
}
}
Uzupełnienie: Jestem niejasno świadomy $&
, $`
i $'
i zostali poinformowani ich unikać, jeśli to możliwe, i nie mam dostępu do ${^PREMATCH}
, ${^MATCH}
i ${^POSTMATCH}
w moim środowisku Perl 5.8 . Powyższy przykład można podzielić na partycje 2/3 za pomocą metod takich jak te, a bardziej złożone rzeczywiste przypadki można ręcznie iterować to, ale myślę, że chciałbym ogólne rozwiązanie, jeśli to możliwe.
Zaakceptowany Odpowiedź: co chcę istniał i niespodziewanie (przynajmniej dla mnie) nie jest grupą hermetyzującego sprawia, że jego zawartość nieprzejrzysty, tak że kolejne pozycyjne wsteczne zobaczyć zawartość jako pojedynczy podmiot i nazwy odnośniki o wyznaczonym zakresie. gbacon ma potencjalnie użyteczne obejście dla Perla 5.10+, a FM pokazuje mechanizm iteracyjny dla każdej wersji, która może osiągnąć ten sam efekt w określonych przypadkach, ale j_random_hacker nazywa to brakiem mechanizmu języka rzeczywistego do enkapsulacji podwyrażeń.
+1 Dobra robota z kolejnymi zmianami. – FMc