Frage zu StringRegExpReplace

  • Ich habe ein "kleines" Problem mit StringRegExpReplace

    Bevor ich nun zu meinem Problem komme, kurz zur Erläuterung:
    Ich bin Programmierer für NC-Werkzeugmaschinen und schreibe aktuell an einem kleinen Editor.
    Wenn ich ein NC-Programm aus der Maschine sichere, hat die Steuerung aus Platzgründen alle Leerzeichen entfernt.

    Hier mal kurz der Aufbau eines NC-Programmes:
    Original:

    Code
    N5 M6 T1 (BOHRER D10)
    N10 G0 G54 X10 Y30 S500 M3
    N15 G0 Z30
    N20 G81 R2 Z-15 F500
    N20 G0 G80 Z300

    Rückgabe aus Maschine:

    Code
    N5M6T1(BOHRER D10)
    N10G0G54X10Y30S500M3
    N15G0Z30
    N20G81R2Z-15F500
    N20G0G80Z300

    Ich hoffe, ihr seht mein Problem. Ich möchte quasi, falls möglich, per StringRegExpReplace() vor allen Buchstaben ausser "N" und vor "(" ein Leerzeichen einfügen, wobei der Text zwischen den Klammern ausgespart werden soll, da dies einen von der Maschine nicht gelesenen Kommentar darstellt, der auch nicht verändert wird.

    Ich bedanke mich schonmal für die Hilfe von euch Profis

    Gruß Shadow

    UNPLEASANT SPOILER

    You just lost the game!

    Einmal editiert, zuletzt von shadow667 (1. Juni 2011 um 20:20)

  • Mit deiner Technik würde vor jedem Zeichen außer den 2 ein Leerzeichen kommen, versuch lieber hinter Buchstabe-Zahl-nichtklammerzuundnichtzeilenende ein Leerzeichen zu machen. Wenn du es nicht schaffst guck in den Spoiler ^^

    Spoiler anzeigen
    [autoit]

    $new=StringRegExpReplace($old,"(?i)(?s)([A-Z]\d+?)[^)\r\n]","$1 ")

    [/autoit]
  • Mit deiner Technik würde vor jedem Zeichen außer den 2 ein Leerzeichen kommen, versuch lieber hinter Buchstabe-Zahl-nichtklammerzuundnichtzeilenende ein Leerzeichen zu machen. Wenn du es nicht schaffst guck in den Spoiler ^^

    Spoiler anzeigen
    [autoit]

    $new=StringRegExpReplace($old,"(?i)(?s)([A-Z]\d+?)[^)\r\n]","$1 ")

    [/autoit]

    Ich fress den Syntax von StringRegExpReplace net... allerdings, wenn ich deine Zeile in mein Script einfüge, werden die Leerzeichen zwar eingefügt, aber teilweise andere Zeichen dadurch ersetzt... warum auch immer :D

    UNPLEASANT SPOILER

    You just lost the game!

    • Offizieller Beitrag

    Wenn du möchtest kannst du es auch ohne RegExp lösen (auch wenn es länger ist)

    Spoiler anzeigen
    [autoit]

    Local $s = _
    "N5M6T1(BOHRER D10)" & @CRLF & _
    "N10G0G54X10Y30S500M3" & @CRLF & _
    "N15G0Z30" & @CRLF & _
    "N20G81R2Z-15F500" & @CRLF & _
    "N20G0G80Z300"

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

    Local $a1 = StringSplit($s, @CRLF, 1)
    Local $aOut[$a1[0]], $tmp = '', $fBraces = False

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

    For $i = 1 To $a1[0]
    $a2 = StringSplit($a1[$i], '')
    For $j = 1 To $a2[0]
    Select
    Case $a2[$j] = '('
    $fBraces = True
    $tmp &= ' ('
    Case $a2[$j] = ')'
    $fBraces = False
    $tmp &= ')'
    Case $fBraces Or $a2[$j] = 'N' Or IsNumber($a2[$j])
    $tmp &= $a2[$j]
    Case Not $fBraces And (Asc($a2[$j]) > 64 And Asc($a2[$j]) < 91)
    $tmp &= ' ' & $a2[$j]
    Case Else
    $tmp &= $a2[$j]
    EndSelect
    Next
    $aOut[$i-1] = $tmp
    $tmp = ''
    Next

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

    _ArrayDisplay($aOut)

    [/autoit]
    • Offizieller Beitrag

    Hier noch die Variante für RegExp, damit es nicht zu haarsträubend wird, habe ich den Klammerausdruck zwischengesichert und nach Leerzeicheneinfügen wieder eingesetzt.
    Ich gehe mal davon aus, dass immer nur ein Klammerausdruck enthalten ist, anderenfalls müßte man das noch abändern.

    Spoiler anzeigen
    [autoit]

    Local $s = _
    "N5M6T1(BOHRER D10)" & @CRLF & _
    "N10G0G54X10Y30S500M3" & @CRLF & _
    "N15G0Z30" & @CRLF & _
    "N20G81R2Z-15F500" & @CRLF & _
    "N20G0G80Z300"

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

    $sBraces = StringRegExp($s, '\(.+\)', 1)
    $sOut = StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($s, '\(.+\)', '(1)'), '([A-MO-Z(])', ' $1'), '\(1\)', $sBraces[0])
    ConsoleWrite($sOut & @CRLF)

    [/autoit]
  • Um's mal salopp zu sagen: Geilomatik :rock:

    Klappt super, auch wenn ich den Syntax net versteh!

    Was müsste geändert werden, wenn ich am Zeilenanfang kein Leerzeichen haben möchte?

    Edit:

    Trotzdem noch 'n Fehler gefunden: Wenn ein Programm nicht nur einen Kommentar enthält, werden alle anderen Kommentare durch diesen ersetzt ?(

    Edit2: Hab zu spät gelesen, daß du das Klammer-Thema schon angeschnitten hast.... Ja, es kommen unterschiedliche Kommentare vor

    UNPLEASANT SPOILER

    You just lost the game!

    2 Mal editiert, zuletzt von shadow667 (1. Juni 2011 um 19:45)

    • Offizieller Beitrag

    Was müsste geändert werden, wenn ich am Zeilenanfang kein Leerzeichen haben möchte?


    Bei mir erscheinen keine Leerzeichen am Zeilenanfang. :wacko:
    Das ist meine Konsolenausgabe:

    Code
    N5 M6 T1 (BOHRER D10)
    N10 G0 G54 X10 Y30 S500 M3
    N15 G0 Z30
    N20 G81 R2 Z-15 F500
    N20 G0 G80 Z300

  • Bei mir erscheinen keine Leerzeichen am Zeilenanfang. :wacko:
    Das ist meine Konsolenausgabe:

    Code
    N5 M6 T1 (BOHRER D10)
    N10 G0 G54 X10 Y30 S500 M3
    N15 G0 Z30
    N20 G81 R2 Z-15 F500
    N20 G0 G80 Z300

    Das war ja auch nur ein Beispiel-NC-Programm... es kann zwischendurch vorkommen, daß die ein oder andere Zeile kein "N" am Anfang hat

    UNPLEASANT SPOILER

    You just lost the game!

  • Hier noch eine Variante:

    [autoit]


    $sSource = _
    "N5M6T1(BOHRER D10)" & @LF & _
    "N10G0G54X10Y30S500M3" & @LF & _
    "N15G0Z30" & @LF & _
    "N20G81R2Z-15F500" & @LF & _
    "N20G0G80Z300"
    $sNew = StringRegExpReplace($sSource, "(\w\d+)", "$1 ")
    MsgBox(0, "Test", $sNew)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ganz so einfach scheint's dann auch net zu klappen...
    Kommazahlen z.B. 80.3 (wobei im NC-Programm das Komma nen Punkt is) werden auch geteilt dadurch

    So, hier für euch mal zum Testen ein Ausschnitt eines echten NC-Programmes:

    Spoiler anzeigen
    UNPLEASANT SPOILER

    You just lost the game!

  • Ich denke, dass das funktioniert:

    [autoit]

    $sSource = ClipGet()
    $sNew = StringRegExpReplace($sSource, "([A-Z][-.\d]+|\(.*\))", "$1 ")
    ; RegExp trifft entweder einen Befehl (Buchstabe + Zahl) oder ganze Kommentarklammer
    ; Dadurch wird in Kommentarklammern nichts ersetzt.
    MsgBox(0, "Test", $sNew)

    [/autoit]
  • Ich denke, dass das funktioniert:

    [autoit]

    $sSource = ClipGet()
    $sNew = StringRegExpReplace($sSource, "([A-Z][-.\d]+|\(.*\))", "$1 ")
    ; RegExp trifft entweder einen Befehl (Buchstabe + Zahl) oder ganze Kommentarklammer
    ; Dadurch wird in Kommentarklammern nichts ersetzt.
    MsgBox(0, "Test", $sNew)

    [/autoit]


    Genau so hat's jetz funktioniert! Ich bedanke mich vielmals bei euch allen!

    Gruß Shadow

    UNPLEASANT SPOILER

    You just lost the game!

  • Ganz so einfach scheint's dann auch net zu klappen...
    Kommazahlen z.B. 80.3 (wobei im NC-Programm das Komma nen Punkt is) werden auch geteilt dadurch

    So, hier für euch mal zum Testen ein Ausschnitt eines echten NC-Programmes:

    Was erwartest du, wenn du nur die Hälfte erwähnst?

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Was erwartest du, wenn du nur die Hälfte erwähnst?

    Gruß,
    UEZ

    Man möge mir verzeihen, ich war noch nie gut im genauen schildern von Problemen, letztendlich wurde das Problem dann aber doch gelöst

    Gruß Shadow

    UNPLEASANT SPOILER

    You just lost the game!

  • Man möge mir verzeihen, ich war noch nie gut im genauen schildern von Problemen, letztendlich wurde das Problem dann aber doch gelöst


    Ja, weil du letztendlich doch eine komplette Datei gepostet hast ;)