RexExp einfache Tags auflösen

eraz00r

Grünschnabel
Hallo,

ich habe ein Problem bei der Definition eines regulären Ausdrucks.

Ich möchte mit folgendem InputString
<name>ZM_TESSAMW _GET_VORGANGSNR mwwf_common _0001</name>, <name>ZM_TESSAMW _HR_MITARBEITER mwwf_common 0002</name>

die Elemente zwischen <name>/</name>-Tags auflösen.

Bisher habe ich dies mit folgender Expression versucht:
"(?s)(<name>(.*?)</name>)?"

per matcher.find() möchte ich später die einzelnen Gruppierungen - sprich matcher.group(2) auflösen.

Leider ist es jedoch so, dass bei meinem Ausdruck die beiden inneren Tags </name>, <name> immer mit im Result auftauchen.
Ich vermute es liegt an einer "non-greedy" / "greedy" - Problematik.

Kann mir jemand helfen und angeben was meinem Statement fehlt?

Im Voraus vielen Dank!
 
Hi.

Welche Gruppe gibst du denn aus?

0 -> gesamter übereinstimmender Text
1 -> Text von Gruppe 1
2 -> Text von Gruppe 2

Gruß
 
Hi,

also bei der genannten Expression immer matcher.group(2). Mehr gibts auch leider nicht :-(

Viele Grüße,
Andreas
 
Hi.

Zeig deinen Code.

Java:
// Groovy !
import java.util.regex.*

def txt = """<name>ZM_TESSAMW _GET_VORGANGSNR mwwf_common _0001</name>, <name>ZM_TESSAMW _HR_MITARBEITER mwwf_common 0002</name>"""

def rgx = Pattern.compile("(?s)(<name>(.*?)</name>)?")

def m = rgx.matcher(txt)

while (m.find()) {
  println m.group(2);
}
Ausgabe:
Code:
ZM_TESSAMW _GET_VORGANGSNR mwwf_common _0001
null
null
ZM_TESSAMW _HR_MITARBEITER mwwf_common 0002
null
Gruß
 
Ja, das leidige Thema das man alles haben will ausser es ist der String xyz.
in deinem Beispiel dürfte der folgende Pattern ev. weiterhelfen.
Code:
<name>((?:[^<]|<[^\/]|<\/[^n]|<\/n[^a]|<\/na[^m]|<\/nam[^e]|<\/name[^>])*)<\/name>

PS. Habe gerade vor einer Stunde ein Hilfsprogramm in PHP geschrieben um diese mühsamen negativ-Strings zu generieren: http://wiki.yaslaw.info/wikka/PhpToolsRegExpNegative.
Werd es demnächst auch auf den server stellen...
 
Ja, das leidige Thema das man alles haben will ausser es ist der String xyz.
in deinem Beispiel dürfte der folgende Pattern ev. weiterhelfen.
Code:
<name>((?:[^<]|<[^\/]|<\/[^n]|<\/n[^a]|<\/na[^m]|<\/nam[^e]|<\/name[^>])*)<\/name>

PS. Habe gerade vor einer Stunde ein Hilfsprogramm in PHP geschrieben um diese mühsamen negativ-Strings zu generieren:
Aber wozu? Das funktioniert doch mit nicht-gierigen Quantifizierern bzw. neg. LookAhead Zusicherungen viel einfacher?!
Code:
<name>((?:.(?!</name>))*.?)</name>
Gruß
 
Zuletzt bearbeitet:
Aber wozu? Das funktioniert doch mit nicht-gierigen Quantifizierern bzw. neg. LookAhead Zusicherungen viel einfacher?!
Code:
<name>((?:.(?!</name>))*.)</name>
Gruß

Ganz einfach, weil ich bei diesen Konstruktionen noch nie so ganz den Durchblick hatte und meine Art noch aus den VB6-Zeiten kenne.
Muss mich wieder mal verscuen Schlau zu machen - ev. klappts ja dieses mal.
 
Zurück