PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RegEx innerhalb eines Strings wiederholen???


freeze
10.06.2006, 22:34
Hey @all,

ich stehe vor folgendem Problem, das ich einen pattern mehrmals an einem String anwenden will, aber der letzten gefundenen suchposition.

Beispiel
<simple>11111</simple>blabla<simple>22222</simple>blabla........

ich hätte das wie folgt gelöst:

while($page =~ /(<simple>(.+?)</simple>)(.*)\1{*}) {
$page = $3;
print "Ausgabe: $2\n";
}


Aber ich bekomme immer nur das erste "11111" das zweite überspringt er immer irgendwie. Kann mir jemand meinen Denkfehler zeigen bzw. mir sagen wie man das eleganter eventuell nur mit regex lösen kann?

Vielen Dank im Voraus

Lg freeze


butterkeks
10.06.2006, 23:28
for($page =~ /<simple>(.*?)<\/simple>/g) {
#... match steht jeweils in $_
}

freeze
10.06.2006, 23:35
danke vielmals, jedoch was mache ich wenn ich mehrere klammern habe beispielsweise in so einem fall:

for($page =~ /<a href=(['"])(.*)\1>/g) {
.
.
.
}


Du sagtest der match ist in $_ wie bekomme ich hier den 2ten oder einen X-beliebigen klammerausdruck?

Lg freeze

butterkeks
11.06.2006, 18:48
wenn du ohne /g matchst, dann kommst du über $1, $2, ... ${10}, ... an die einzelnen submatches (in $1 steht der Inhalt der ersten Klammer, etc.).

Weißt du allerdigs nicht im Vorraus, wieviele Submatches es überhaupt gibt, kannst du die LIste auswerten, die der =~ Operator ausgibt, denn diese enthält die Matches in der Form (wenn du z.B. 2 Klammern im Regex hast):

0 submatch 1
1 submatch 2
2 submatch 1
3 submatch 2
...

Da du in dem obigen Beispiel insgesamt nur einen Submatch hast, kannst du die Liste mit for(){} einfach elementweise durchgehen:

for $item(@liste) {
# $item enthält jeweils ein Element von @liste
}

lässt du $item (oder einen beliebigen anderen Bezeichner) aus, wird stattdessen $_ verwendet.

Du kannst die zurückgegebene Liste natürlich auch ohne for bearbeiten.

naja, war jetzt schon sehr offtopic... weitere Fragen stellst du besser im Perl Forum