2016-05-24 10 views
2

Dies ist wahrscheinlich sehr einfach zu erreichen, aber ich kann nicht herausfinden, die eleganteste und einfachste Weg, um meine gewünschten Ergebnisse zu produzieren. Grundsätzlich wird eine Textdatei als Eingabe für mein Programm gesendet. Alle Zeichenfolgen in dieser Datei sind durch Zeilenumbrüche getrennt (\r), neue Zeilenvorschübe (\n) oder eine Kombination aus beidem.Pattern Matching Strings, die in verschiedenen nicht gedruckten Chars enden

Gerade jetzt, meine Funktion ist die folgende

local function file_Parse(input) 
    local inputTbl = {} 
    if input then 
     for lines in input:gmatch("%g*%G*") do 
      lines = lines:gsub("\r\n", "") 
      table.insert(inputTbl, #inputTbl + 1, lines) 
     end 
    end 
    return inputTbl 
end 

Nun ist diese sehr einfach ist. Die empfangene Eingabe sieht in etwa wie folgt aus:

DFEIJ-SDFA\r\nDAFK-DAFDAFEA\r\nDKLAJFDAKJFE-DFAKJ\r\n zum Beispiel. Bitte beachte, dass ich \r\n zwischen die Saiten platziert habe, die ich möchte. Aber manchmal kann ich eine Mischung aus Wagenrücklauf und Zeilenvorschub haben, in unterschiedlicher Reihenfolge oder ohne eine der beiden, zufällig zwischen den Saiten, die ich möchte. Das ist mein Problem.

Jetzt funktioniert es in der Funktion, die ich oben zur Verfügung gestellt habe, aber für mich muss lines = lines:gsub("\r\n","") in diese überhaupt eingeben, wirklich mich stört. Ich denke, dass ich in der Lage sein sollte, mich am Anfang meiner for-Schleife innerhalb der lines:gmatch("%g*%G*") Zeile zu kümmern und automatisch diese nicht-druckbaren Zeichen nicht zu erfassen. Aber ich kann nicht für das Leben von mir die beste Möglichkeit zu überprüfen, ob \r, \n, oder beide \r\n (oder \n\r) abgestimmt ist, nur die druckbaren Zeichen greifen und die nicht druckbaren Zeichen vergessen.

Ich habe versucht, verschiedene Methoden zu versuchen und in den meisten Fällen scheint es nicht lines in meine for-Schleife zu erfassen und sie in die Tabelle einzugeben. Ich habe einige der folgenden versucht:

("(%g*%G*)[\r\n]")

("(%g*%G*)[\r*\n*]")

("(%g*%G*)[\r-\n-]")

("(%g*%G*)[\r?\n?]")

("(%g*%G*)[%c]")

("(%g*%G*)[%c-]")

("(%g*%G*)[%c+]")

Ich habe beide http://lua-users.org/wiki/PatternsTutorial und http://www.lua.org/manual/5.2/manual.html#6.4.1 Ressourcen lesen, aber ich Fehler richtig alle druckbaren Zeichen packen und nicht die nicht druckbare Zeichen. Ich würde mich über einen Ratschlag freuen, der mir hilft, zu verstehen, was ich falsch mache und die Antwort auf den Ansatz, nach dem ich suche.

+0

'für Zeilen in der Eingabe: gmatch ("% g +") do' –

Antwort

2

Wie EgorSkriptunoff im Kommentar gesagt, sollte %g tun, was Sie wollen, aber Sie müssen daran denken, dass es keine Leerzeichen erfasst, also wenn Ihre Zeilen eine Mischung aus druckbaren und Leerzeichen enthalten, benötigen Sie so etwas verwenden:

for lines in input:gmatch("[%g ]+") do 

Daraus ergeben sich die folgenden drei Zeilen am Eingang Ihnen gezeigt:

DFEIJ-SDFA 
DAFK-DAFDAFEA 
DKLAJFDAKJFE-DFAKJ 
+0

Wow .. .. habe ich diesen verpfuscht! Haha. Ich hätte Egor einen Punkt für die Hilfe gegeben, aber offensichtlich nicht. Entschuldigen Sie.Danke euch beiden für eure Hilfe und ich schätze die Klärung, Paul. – Pwrcdr87