Regulärer Ausdruck Funktion unklar
Jan K.
- programmiertechnik
0 dedlfix0 Alexander (HH)0 Jan K.
Hallo liebes Forum,
folgender Regulärer Ausdruck entfernt XML Kommentare:
(?s)<!--.*?-->
(Quelle: http://stackoverflow.com/questions/6804951/regex-to-remove-comments-in-xml-file-in-eclipse-java)
Der hintere Teil trifft meiner Meinung nach non-greedy einzeilige Kommentare.
Der vordere Teil ist mir ein Rätsel.
Kann mir jemand auf die Sprünge helfen wie dieser Ausruck arbeitet?
Unten hänge ich noch eine Beispiel XML-Code an.
Ich benutze ein regex-replace plugin für gedit das mit python-regex arbeitet.
Grüße aus Berlin,
Jan
<?xml version="1.0" encoding="UTF-8" ?>
<wwrite Zeitnahme="n">
<MessageConf>
<sql id="veranstaltungsname" db="lsf" sql="select dtxt from veranstaltung where veranstid=[veranstId]" />
</MessageConf>
<module>
<fsemmod verwendeteDB="sospos">
<matches>
<!-- Neue Konfigurationsmoeglichkeit:-->
<match continue="y">1|1|1|1|1|1</match>
<xmatch>1|1|1|1|1|1</xmatch>
<match>1|1|1|0|1|1</match>
<match>1|1|0|0|1|1</match>
<match>1|1|1|0|0|1</match>
<match>1|1|0|0|0|1</match>
<match>1|1|1|0|0|0</match>
<match>1|1|0|1|0|0</match>
<match>1|1|0|0|1|0</match>
<match>1|1|0|0|0|0</match>
<match>1|0|0|0|1|1</match>
<match>0|1|0|0|1|1</match>
<match>1|0|0|0|1|0</match>
<match>1|0|0|0|0|1</match>
</matches>
<!-- laenge: Zusammensetzung des Internen Schluessels der Studiengaenge. Der letzte darf 'x'= beliebig lang sein -->
<alleStg laenge="10|2|10">
<SQL ODBC="lsf">
<Select>
<default>SELECT DISTINCT k_abstgv.abstgv, k_abstgv.kzfa, k_abstgv.pversion, k_abstgv.abstgvnr FROM k_abstgv</default>
</Select>
</SQL>
</alleStg>
<studentStg laenge="2|3|3|2|2|10">
<Parameter Name="stgNrs" ODBC="lsf" dbSpalte="k_abstgv.abstgvnr" />
<SQL ODBC="sospos" VeloName="sosposStgDaten">
<Select>
<default>
SELECT DISTINCT stg.abschl AS StgAbs, stg.stg AS StgStg, stg.vert AS StgVer, stg.schwp AS StgSch, stg.kzfa AS StgKzf,
stg.pversion AS StgPve, stg.semester AS StgSem, stg.stgsem AS StgSSe, stg.klinsem AS SosFsemmod,
k_abint.ktxt AS AbiKtx
FROM (stg INNER JOIN sos ON (sos.semester=stg.semester AND stg.mtknr=sos.mtknr))
LEFT JOIN k_abint ON (stg.abschl=k_abint.abint)
WHERE stg.mtknr=$session_ident_S
</default>
<!-- Hat sich ein Student zurückgemeldet so wird in der stg-Tabell ein neuer Satz erzeugt
für das neue Semester und auch in der Tabelle sos wird semester hochgesetzt.
Um falsche Ausgabe der Studiengangspläne zu vermeiden, muss es o.g. SQL angepasst werden.
($Bezugssemester=stg.semester anstatt sos.semester=stg.semester)
-->
<!--
<default>
SELECT DISTINCT stg.abschl AS StgAbs, stg.stg AS StgStg, stg.vert AS StgVer, stg.schwp AS StgSch, stg.kzfa AS StgKzf,
stg.pversion AS StgPve, stg.semester AS StgSem, stg.stgsem AS StgSSe, stg.klinsem AS SosFsemmod,
k_abint.ktxt AS AbiKtx
FROM (stg INNER JOIN sos ON ($Bezugssemester=stg.semester AND stg.mtknr=sos.mtknr))
LEFT JOIN k_abint ON (stg.abschl=k_abint.abint)
WHERE stg.mtknr=$session_userID
</default>
-->
</Select>
</SQL>
</studentStg>
<SQL ODBC="lsf" VeloName="lsfStgDaten" addStudentValues="y">
<Select>
<default>
SELECT DISTINCT k_abstgv.abstgvnr AS AbsNr, k_abstgv.abstgv AS AbsID, k_abstgv.ktxt AS AbsKtx, k_abstgv.dtxt AS AbsDtx,
k_abstgv.abschl AS AbsAbs, k_abstgv.pversion AS AbsPve, k_abstgv.schwp AS AbsSch, k_abstgv.vert AS AbsVer
FROM k_abstgv
WHERE #if($stgNrs) $stgNrs #else 0=1 #end
</default>
</Select>
</SQL>
<SQL ODBC="sospos" VeloName="semester_fsem" addStudentValues="n">
<Select>
<default>
SELECT DISTINCT stg.semester AS StgSem, stg.stgsem AS StgSSe FROM stg WHERE stg.mtknr=$session_userID
</default>
</Select>
</SQL>
<Session Name="session_stg_lsfStgNr" Quelle="session_stg_lsfStgDaten" Feld="AbsNr" AbhIDFeld="AbsNr" Methode="copy"/>
<Session Name="session_stg_fsemmod" Quelle="session_stg_lsfStgDaten" Feld="StgSSe" AbhIDFeld="AbsNr" Methode="copy"/>
<Session Name="session_stg_fsemmodMap" Quelle="session_stg_semester_fsem" Feld="StgSSe" AbhIDFeld="StgSem" Methode="map"/>
<!--<Session Name="session_stg_abschnitt" Quelle="session_stg_lsfStgDaten" Feld="SosFsemmod" AbhIDFeld="AbsNr" Methode="makeAbschnitt"/>-->
<!--
Parameter der Session sind:
session_stg_stgNrs: Alle moeglichen abstgvnr aus dem Match als Array
session_stgarray_stgNrs: Alle moeglichen abstgvnr aus dem Match als komma-separierte Liste
session_stg_lsfStgNr: Die 'aktive' abstgvnr
session_sql_stgNrs: der Schuessel 'stgNrs'
session_stg_lsfStgDaten: Element, Ergebnis des SQL um sospos-Informationen ergaenzt
session_stg_fsemmod: Modifiziertes Fachsemester, im einfachen Fall das Feld stg.stgsem.
session_stg_fsemmod_prop: key=lsf.k_abstgv.abstgvnr, value=fsemmod. Alle Werte, die mit Methode=copy erzeugt wurden, werden in eine Property mit Namen [Name]_prop geschrieben.
Zusätzlich sind die Properties key und value enthalten, damit man weiß, was es bedeutet.
-->
</fsemmod>
</module>
</wwrite>
Tach!
folgender Regulärer Ausdruck entfernt XML Kommentare:
(?s)<!--.*?-->
Der hintere Teil trifft meiner Meinung nach non-greedy einzeilige Kommentare.
Der vordere Teil ist mir ein Rätsel.Kann mir jemand auf die Sprünge helfen wie dieser Ausruck arbeitet?
Ich benutze ein regex-replace plugin für gedit das mit python-regex arbeitet.
Dann lautet das Such-Stichwort "python regex". Die Erklärung versteckt sich im Absatz "(?iLmsux)".
Unten hänge ich noch eine Beispiel XML-Code an.
Bitte demnächst auf das wesentliche reduzieren. (Abgesehen davon hat es das nicht gebraucht.)
dedlfix.
Dann lautet das Such-Stichwort "python regex". Die Erklärung versteckt sich im Absatz "(?iLmsux)".
http://docs.python.org/2/library/re.html -> (?iLmsux) -> The group matches the empty string; the letters set the corresponding flags: -> re.S (dot matches all)
-> Verstehe ich so:
Es wird ein Flag gesetzt dass für den gesamten Regulären Ausdruck festgelegt, dass der Punkt alles match, auch neue Zeilen.
Es ist bei gedit mit Regex-Replace Plugin auch egal an welcher Stelle das definiert wird, folgende Ausdrücke liefern das selbe Ergebnis:
((<match>.*</match>)|(<default>.*?</default>))(?s)(?m)
(?s)(?m)((<match>.*</match>)|(<default>.*?</default>))
((<match>.*</match>)|((?s)(?m)<default>.*?</default>))
Danke für den Tipp mit (?iLmsux), habe zumindest ein wenig mehr Regex dadurch gelernt.
Grüße aus Berlin,
Jan
Tach!
http://docs.python.org/2/library/re.html -> (?iLmsux) -> The group matches the empty string; the letters set the corresponding flags: -> re.S (dot matches all)
Es wird ein Flag gesetzt dass für den gesamten Regulären Ausdruck festgelegt, dass der Punkt alles match, auch neue Zeilen.
Fast. Es gilt zumindest ab der Stelle, an der dieser Ausdruck steht. Und der Punkt matcht nicht neue Zeilen sondern Zeilenumbrüche (letzteres sind Zeichen - Zeilen als solche sind nicht wirklich relevant). Im PHP-Handbuch zu Internal option settings steht noch ein wenig mehr, unter anderem auch, wie man die Option wieder ausschaltet. Ob das auch für Python gilt, entzieht sich meiner Kenntnis. Üblicherwiese bedienen sich ja die Systeme alle derselben RegExp-Bibliothek.
dedlfix.
Moin Moin!
folgender Regulärer Ausdruck entfernt XML Kommentare:
(?s)<!--.*?-->
Öm, nö.
Erstmal matcht der nur Dinge, die wie Kommentare in XML aussehen, aber entfernt sie nicht.
Zweitens matcht der auch Dinge wie "<!-- -- -->". Das ist aber kein gültiger XML-Kommentar.
Und drittens matcht der Ausdruck auch stinknormale Strings in CDATA-Sektionen, wenn sie nach Kommentaren aussehen.
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!-- Kommentar -->
<foo><![CDATA[ <!-- kein Kommentar --> ]]></foo>
</root>
Der hintere Teil trifft meiner Meinung nach non-greedy einzeilige Kommentare.
Wie kommst Du auf "einzeilig"?
Alexander
folgender Regulärer Ausdruck entfernt XML Kommentare:
(?s)<!--.*?-->Öm, nö.
Du Hast Recht, er trifft XML-Kommentare.
Erstmal matcht der nur Dinge, die wie Kommentare in XML aussehen, aber entfernt sie nicht.
Du hast Recht, ein Regex mit Replace würde sie ersetzen.
Zweitens matcht der auch Dinge wie "<!-- -- -->". Das ist aber kein gültiger XML-Kommentar.
Du hast Recht, aberr das wär ja garnicht schlecht.
Und drittens matcht der Ausdruck auch stinknormale Strings in CDATA-Sektionen, wenn sie nach Kommentaren aussehen.
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!-- Kommentar -->
<foo><![CDATA[ <!-- kein Kommentar --> ]]></foo>
</root>
Danke das du das erwähnt hast, habe mich wegen dir 30min mit #CDATA beschäftigt und was dazugelernt!
> > Der hintere Teil trifft meiner Meinung nach non-greedy einzeilige Kommentare.
>
> Wie kommst Du auf "einzeilig"?
Weil der hintere Teil in meinem gedit regex-replace nur einzeilig matcht.
Grüße aus Berlin,
Jan
Tach!
Der hintere Teil trifft meiner Meinung nach non-greedy einzeilige Kommentare.
Wie kommst Du auf "einzeilig"?
Weil der hintere Teil in meinem gedit regex-replace nur einzeilig matcht.
Das liegt aber nicht an dem Ausdruck, sondern daran, dass der Punkt generell keine Zeilenumbrüche einschließt. Das muss man ihm mit einem globalen Flag oder wie in diesem Fall einem lokalen Flag sagen.
dedlfix.
Moin Moin!
folgender Regulärer Ausdruck entfernt XML Kommentare:
(?s)<!--.*?-->Öm, nö.
Der hintere Teil trifft meiner Meinung nach non-greedy einzeilige Kommentare.
Wie kommst Du auf "einzeilig"?
Weil der hintere Teil in meinem gedit regex-replace nur einzeilig matcht.
Du meinst mit "hinteren Teil" alles außer (?s), und das s wird als Flag an die RegExp-Engine weitergereicht. Richtig?
Ich kenne das s-Flag aus Perl so, dass es die Bedeutung von "." auf Newlines (CR, LF und einige Zeichen außerhalb von ASCII) erweitert. Man benennt es typischerweise als "(treat input as) single line flag".
Wie gerade erklärt, beschränkt es die Wirkung nicht auf eine Zeile, sondern behandelt die gesamte Eingabe als eine einzige Zeile, die Sonderbehandlung für CR, LF & Co entfällt. Das ist also nahezu das exakte Gegenteil.
Deswegen die provokante Frage nach "einzeilig".
Alexander