StringRegExpReplace und Whitespaces

  • Es will einfach nicht klappen. In verschiedenen XML-Dateien sollen alle
    <name>...</name>
    <desc>...</desc>

    ersetzt werden durch:
    <name>...</name>
    <cmt></cmt>
    <desc>...</desc>

    Da die XML-Dateien verschiedenen Ursprungs sind, kann der Zeilenumbruch durch @CR, @LF oder @CRLF erfolgen und die Zeilen können durch @TAB oder Spaces eingerückt sein.
    Bei meiner bisherigen Lösung mit \s werden nur @CR und @LF berücksichtigt.

    [autoit]


    $chars= @CRLF _
    & '<name>Vorname_1</name>' & @CR & '<desc>Nachname_1</desc>' & @CRLF _
    & '<name>Vorname_2</name>' & @LF & '<desc>Nachname_2</desc>' & @CRLF _
    & '<name>Vorname_3</name>' & @CRLF & '<desc>Nachname_3</desc>' & @CRLF _
    & ' <name>Vorname_4</name>'& @LF & ' <desc>Nachname_4</desc>' & @CRLF _
    & @TAB & '<name>Vorname_5</name>'& @CR & @TAB & '<desc>Nachname_5</desc>'

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,'',$chars)
    $chars=StringRegExpReplace($chars,'</name>\s<desc>','</name>' & @CRLF & '<cmt></cmt>' & @CRLF & '<desc>')
    MsgBox(0,'',$chars)

    [/autoit]

    Wie berücksichtige ich alle Zeilenumbrüche und Einrückungen ?

    Einmal editiert, zuletzt von Axel_Zucker (2. März 2011 um 13:51)

  • Der Inhalt von $chars entspricht dem Ausschnitt aus einer XML-Datei, wo alle Eventualitäten vorkommen.

  • @CRLF besteht aus zwei Zeichen, da reicht ein einfaches \s nicht aus:

    [autoit]

    $chars=StringRegExpReplace($chars,'(</name>)(\s+)(<desc>)','$1$2<cmt></cmt>$2$3')

    [/autoit]
  • Wozu der Aufwand mit den Zeilenumbrüchen und Leerstellen? Einfach </name> ersetzen reicht doch aus.

    [autoit]

    $chars= @CRLF _
    & '<name>Vorname_1</name>' & @CR & '<desc>Nachname_1</desc>' & @CRLF _
    & '<name>Vorname_2</name>' & @LF & '<desc>Nachname_2</desc>' & @CRLF _
    & '<name>Vorname_3</name>' & @CRLF & '<desc>Nachname_3</desc>' & @CRLF _
    & ' <name>Vorname_4</name>'& @LF & ' <desc>Nachname_4</desc>' & @CRLF _
    & @TAB & '<name>Vorname_5</name>'& @CR & @TAB & '<desc>Nachname_5</desc>'

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,'',$chars)
    $chars=StringRegExpReplace($chars,'</name>','</name>' & @CRLF & '<cmt></cmt>')
    MsgBox(0,'',$chars)

    [/autoit]
  • :rock: Perfekt, genauso wollte ich es haben. Der Großvater hats hinbekommen, danke :D

    UEZ:
    "Würde ein StringReplace() nicht helfen?"

    Nein, nur wenn keine Whitespaces vorkommen.

    i2c:
    "Wozu der Aufwand mit den Zeilenumbrüchen und Leerstellen? Einfach </name> ersetzen reicht doch aus."
    </name> kommt aber auch in Verbindung mit anderen Tags vor. Dann soll es ja gerade nicht ersetzt werden...

    Einmal editiert, zuletzt von Axel_Zucker (2. März 2011 um 13:45)