Announcement

Collapse
No announcement yet.

replace: Teile des RegEx-Ausdrucks als Variable verwendbar?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • replace: Teile des RegEx-Ausdrucks als Variable verwendbar?

    Hallo,

    ich habe folgendes Element in meinem Ursprung:
    Code:
    <test>aber ich gehe nicht nach Hau- Se, sondern nach Hau- se</test>
    bei dem ich gerne die Silbentrennung korrekt bearbeiten möchte: "Hau- Se" soll bleiben, "Hau- se" aber zu "Hause" werden.

    Mit einem kleinen Stylesheet
    Code:
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    	<xsl:template match="test">
    		<xsl:variable name="text" select="//test"/>
    		<text>
    			<xsl:value-of select="replace($text,'- [a-z]','')"/>
    		</text>
    	</xsl:template>
    </xsl:stylesheet>
    finde ich zwar die richtigen Stellen, doch dann haut es natürlich auch den nächsten Buchstaben weg: "Haue". Wie kann ich denn im Ersatzstring den Wert des Matches "[a-z]" auswerten?

  • #2
    Ansatz:
    Code:
    <xsl:value-of select="replace($text,'(.*)(-\s)([a-z])(.*)','$1$3$4')"/>
    Ergebnis:
    Code:
    <text>aber ich gehe nicht nach Hau- Se, sondern nach Hause</text>
    Die $n-Werte beziehen sich auf die einzelnen Gruppenausdrücke ($2 soll hier gerade wegfallen).

    Comment


    • #3
      Danke. Im Kleinen funktioniert das.
      Nur, wenn die Ausgangs-XML so ausschaut:
      Code:
      <t>
      	<line number="6"> Lorem ipsum dolor-</line>
      	<line number="7"> Lorem ipsum dolor-</line>
      	<line number="8"> sit amet,</line>
      	<line number="9"> consetetur sadipscing elitr.</line>
      	<line number="10"/>
      	<line number="11"> Lorem ipsum dolor-</line>
      	<line number="12"> sit amet-</line>
      	<line number="13"> consetetur sadipscing elitr</line>
      	<line number="14"> Lorem ipsum dolor-</line>
      	<line number="15"> sit amet</line>
      </t>
      Und das Template so:
      Code:
      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
      	<xsl:template match="t">
      		<test>
      			<xsl:for-each-group select="//line" group-ending-with="line[not(node())]">
      				<xsl:if test="current-group()[self::line[node()]]">
      					<xsl:value-of select="replace(string-join((., current-group()[position() gt 1]), ''),'(.*)(-\s)([a-z])(.*)','$1$3$4')"/>
      				</xsl:if>
      			</xsl:for-each-group>
      		</test>
      	</xsl:template>
      </xsl:stylesheet>
      ist die Ausgabe nicht mehr korrekt:
      <test> Lorem ipsum dolor- Lorem ipsum dolorsit amet, consetetur sadipscing elitr. Lorem ipsum dolor- sit amet- consetetur sadipscing elitr Lorem ipsum dolorsit amet</test>
      Nur finde ich nicht den Fehler.....

      Comment


      • #4
        Entweder passt der übergebene String nicht zum RegEx oder es ist umgekehrt. Gib doch mal den jeweiligen String allein aus.

        Comment


        • #5
          <par>Ab 14 Uhr gebe es Behinderungen bei der Paartalbahn zwischen Augsburg und In- golstadt, der Ammerseebahn zwischen Augsburg und Schongau sowie der Verbin- dung Freilassing-Berchtesgaden, teilte die GDL mit. Bei den vorangegangenen Streikaktionen hatten sich die Einschränkungen aber in Grenzen gehalten.</par>
          kommt im Original raus.

          Und selbst ein
          '(.*)(-)(.{1})([a-z])','$1$4'
          wird damit nicht fertig.???

          Der Ursprung:
          Code:
                  <line number="11"> Ab 14 Uhr gebe es Behinderungen bei der</line>
                  <line number="12"> Paartalbahn zwischen Augsburg und In-</line>
                  <line number="13"> golstadt, der Ammerseebahn zwischen</line>
                  <line number="14"> Augsburg und Schongau sowie der Verbin-</line>
                  <line number="15"> dung Freilassing-Berchtesgaden, teilte</line>
                  <line number="16"> die GDL mit. Bei den vorangegangenen</line>
                  <line number="17"> Streikaktionen hatten sich die Ein-</line>
                  <line number="18"> schränkungen aber in Grenzen gehalten.</line>
                  <line number="19" />
                  <line number="20"> Von dem dreitägigen Ausstand nicht be-</line>
                  <line number="21"> troffen ist dieses Mal der Alex, bei</line>
                  <line number="22"> dem es bisher oft Ausfälle gab.</line>
          Das Ergebnis:
          Code:
          <par>Ab 14 Uhr gebe es Behinderungen bei der Paartalbahn zwischen Augsburg und In- golstadt, der Ammerseebahn zwischen Augsburg und Schongau sowie der Verbin- dung Freilassing-Berchtesgaden, teilte die GDL mit. Bei den vorangegangenen Streikaktionen hatten sich die Einschränkungen aber in Grenzen gehalten.</par>
          		<par>Von dem dreitägigen Ausstand nicht betroffen ist dieses Mal der Alex, bei dem es bisher oft Ausfälle gab.</par>
          Seltsam dabei, dass es im zweiten <par> funktioniert.

          Comment


          • #6
            Lösung gefunden:

            replace(replace(replace(string-join((substring-after(., ': '), current-group()[position() gt 1]), ''),'(-\s)([A-Z]{1})','-$2'), '- ',''),'>>>','')
            Damit lösche ich zuerst die Leerzeichen, wenn nach dem "- " ein Großbuchstabe auftaucht. Und dann kann ich mit dem einfachen replace (string, '- ','') den Rest entfernen.

            Comment

            Working...
            X