Dies ist sehr weit von "offensichtlich"; andererseits. Es gibt keinen direkten Weg zu sagen "nicht übereinstimmen" für ein komplexes Muster (es gibt eine gute Unterstützung auf einer Zeichenebene, mit [^a]
, \S
usw.). Bei Regex geht es erstens darum, Dinge zusammen zu bringen, nicht darum, sie nicht zu finden.
Ein Ansatz besteht darin, diese (möglicherweise verschachtelten) Trennzeichen zu vergleichen und alles andere als das zu erhalten.
Ein gutes Werkzeug zum Auffinden verschachtelter Trennzeichen ist das Kernmodul Text::Balanced. Wenn es übereinstimmt, kann es uns auch den Teilstring vor dem Match und den Rest des Strings nach dem Match geben.
use warnings;
use strict;
use feature 'say';
use Text::Balanced qw(extract_bracketed);
my $text = <<'END';
(bar foo bar)
bar foo (
bar foo
(bar) (foo)
)
END
my ($match, $before);
my $remainder = $text;
while (1) {
($match, $remainder, $before) = extract_bracketed($remainder, '(', '[^(]*');
print $before // $remainder;
last if not defined $match;
}
Die extract_bracketed
kehrt das Spiel, der Rest substring ($remainder
) und die Teilkette vor dem Spiel ($before
); also passen wir im Rest zusammen.
Aufgenommen von this post, wo es weitere Details gibt und einen anderen Weg, mit Regexp::Common.
verwenden Sie negative Lookahead? – Boschko