Autor Beitrag
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 09.07.09 16:59 
Hallo,

ich bin noch am verzweifeln...

ich baue momentan ein programm in C#, das mir von einem PHP-code alle leerzeichen entfernt. dies mach ich mit der replace funktion der regex klasse... funktioniert soweit gut... nur das problem: leerzeichen sollen nicht in variablenzuweisungen entfernt werden.

ich scheitere jedenfalls an dem pattern für die regex.

Bsp. des strings, der durch regex.replace wandert: aus...

ausblenden Quelltext
1:
2:
3:
4:
$MyVar1 = "Hallo Welt";
$MyVar2 = "Wie gehts";
$MyVar3 = "Ganz Gut";
$MyVar4 = "Was ist das denn?";


soll das werden...

ausblenden Quelltext
1:
2:
3:
4:
$MyVar1="Hallo Welt";
$MyVar2="Wie gehts";
$MyVar3="Ganz Gut";
$MyVar4="Was ist das denn?";


mein pattern sieht folgendermaßen aus:

ausblenden Quelltext
1:
".*[^"]"					


so habe ich immerhin schon mal die zuweisungsstrings... aber wie sage ich, das er nur die leerzeichen außerhalb entfernen soll? versuche mit look ahead und look behind brachten auch nichts.

danke schonmal für die hilfe.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 09.07.09 18:54 
Ich bin mal so frech und weiche der direkten Frage aus ;P : Was genau hast du denn damit vor? Bei function helloWorld könnte das Entfernen der Leerzeichen beispielsweise relativ schädlich sein...

_________________
>λ=
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 10.07.09 09:06 
aaaahhh mist... stimmt.... das habe ich garnicht bedacht :-/

deshalb brauch ich ja eben ein pattern, mit dem ich sagen kann, das er nur außerhalb von einem string entfernen soll. ich bilde mir ein, das es garnicht soooo viele keywords gibt, bei denen leerzeichen bleiben müssten. obwohl... mhhhh.

um deine frage zu beantworten: ich baue einen tool... welches aus php-code zeichen entfernt, die überflüssig sind. ich nenne es: das-programm-das-überflüssige-zeichen-aus-php-code-entfernt 1.0 :lol:
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 10.07.09 11:22 
Von JS-Minifiern habe ich schon gehört und da macht es auch Sinn, aber bei einer Server-Skriptsprache :gruebel: ... geht dir der Speicherplatz auf deinem Server aus ;) ?
Sei's drum, fangen wir mal an:
So kommt der Regex auch mit Escapings klar:
ausblenden Quelltext
1:
'(\\.|[^\\'])*'					

Das gleich dann noch mit Double Quotes - Heredoc und Nowdoc überlasse ich dir ;) ...
Wenn du mit einem Regex eine Stelle wie ein einzelnes Leerzeichen gefunden hast, kannst du von dort aus allerdings unmöglich feststellen, ob du dich in einem String befindest. Du musst stattdessen den gesamten Code matchen:
ausblenden Quelltext
1:
^(//.*|[^']|'(\\.|[^\\'])*')*					

Heißt quasi: "Code besteht aus Kommentaren, Nicht-Quote-Zeichen oder String-Literalen". Das hier funktioniert damit schonmal, aber es fehlen natürlich beispielsweise noch die zwei anderen Comment-Arten.
Jetzt können wir endlich nach Whitespace suchen, der nicht zwischen zwei alphanumerischen Zeichen steht:
ausblenden Quelltext
1:
^(\w\s+\w|(?<space>\s)|//.*|[^']|'(\\.|[^\\'])*')*					

Mit deinem Code (mit Single Quotes) funktioniert es schonmal, siehe Bild.
...und langsam dürfte klar sein, warum man für so etwas keine Regular Expressions mehr benutzt ;) ...
Einloggen, um Attachments anzusehen!
_________________
>λ=
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 10.07.09 12:21 
danke erstmal.

ne, der platz auf meinem server geht mir nicht aus :D aber die scripte werden so vom server einfach schneller verarbeitet. probiers doch mal aus :D es gibt paar dinge, die man tun kann, um sein code zu komprimieren und der unterschied ist bei größeren systemen deutlich messbar... auch bei php :)

das is ja echt heftig :D ich seh nur backslashes und klammern :P

ich versteh irgendwie nicht wie bzw. wo du sagst "nicht" zwischen einem bestimmten zeichen und nur da ersetzen, wo eben "nicht" zwischen bestimmten zeichen ist!?

mhhhh... was würdest du anstatt regex nehmen ?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 10.07.09 14:23 
user profile iconÄfan hat folgendes geschrieben Zum zitierten Posting springen:
probiers doch mal aus :D
Danke, aber benutze lieber kompilierte, typsichere Sprachen ;) . Dass das einen großen Unterschied macht, kann ich mir trotzdem nicht vorstellen :nixweiss: .
Zitat:
ich versteh irgendwie nicht wie bzw. wo du sagst "nicht" zwischen einem bestimmten zeichen und nur da ersetzen, wo eben "nicht" zwischen bestimmten zeichen ist!?
Mit dem ersten Teil \w\s+\w fange ich die Leerzeichen ab, die nicht ersetzt werden sollen. Nur der Rest landet dann in der "space"-Gruppe, die das Ergebnis darstellt (blau im Screenshot).
Mit Lookaheads/-behinds könnte man eben nicht ausdrücken, dass beide Bedingungen erfüllt sein müssen.
Zitat:
mhhhh... was würdest du anstatt regex nehmen ?
Irgendein Parser Generator, der vernünftiges EBNF akzeptiert. Für C# kann ich dir persönlich keinen empfehlen, ich weiß nur, dass SharpDevelop eine modifizierte Version von Coco/R benutzt. Aber wahrscheinlich bewegen wir uns gerade doch am Rande des Overkills ;) .
Man könnte wenigstens den Regex so zerlegen, wie man es mit BNF machen würde, nur bekommt man ihn dann eben nicht mehr in ein interaktives Tool hinein:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
string singleQuoted = "'(\\.|[^\\'])*')*";
string doubleQuoted = singleQuoted.Replace("'""\"");
string stringLiteral = Or(singleQuoted, doubleQuoted, heredoc, nowdoc);

string lineComment = "(//|#).*";
string comment = Or(lineComment, blockComment);

string code = Or(comment, stringLiteral, ...);

static string Or(params string[] cases) { return string.Join("|", cases); }

Hui, sieht ja schon fast wie ein monadischer Parser aus :D .

_________________
>λ=
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.07.09 11:45 
Zitat:
Danke, aber benutze lieber kompilierte, typsichere Sprachen ;) . Dass das einen großen Unterschied macht, kann ich mir trotzdem nicht vorstellen :nixweiss: .

jaja nehmt nur alle eure typsicheren, fortschrittlicheren und besseren sprachen :D damit kann ja jeder arbeiten... nicht zu wissen, von welchem typ ein objekt oder eine variable ist... das ist dann die herrausforderung. man muss eins mit seinem code werden. da gibts keinen compiler der einem alles vorkaut... so.... und jetzt kommst du!? :D :lol:
Zitat:
Mit dem ersten Teil \w\s+\w fange ich die Leerzeichen ab, die nicht ersetzt werden sollen. Nur der Rest landet dann in der "space"-Gruppe, die das Ergebnis darstellt (blau im Screenshot).
Mit Lookaheads/-behinds könnte man eben nicht ausdrücken, dass beide Bedingungen erfüllt sein müssen.

ahhh ok... verstehe. jo mit den lookaheads und -behinds habe ich mir auch schon fast so gedacht... wäre ja zu einfach gewesen. 8)
Zitat:
Irgendein Parser Generator, der vernünftiges EBNF akzeptiert. Für C# kann ich dir persönlich keinen empfehlen, ich weiß nur, dass SharpDevelop eine modifizierte Version von Coco/R benutzt. Aber wahrscheinlich bewegen wir uns gerade doch am Rande des Overkills ;) .

gut das du "EBNF" verlinkt hast :D :oops:. ich denke auch das der ganze code viel zu inperfomant wird, wenn da noch paar reguläre audrücke und prüfungen rein kommen. ob das den aufwand lohnt, ist eben die andere sache. ich denke ich lasse das mit den leerzeichen weg :D es bringt auch nicht unbedingt sooo viel performance für die php scripte. da sind kommentare etc. schon viel störender... bei einem system mit 400 einzelnen script-dateien merkt man den unterschied schon gewaltig, wenn kommentare entfernt sind.
Zitat:
Hui, sieht ja schon fast wie ein monadischer Parser aus :D .

*schnell "monadisch" google* :oops: mhhhhmm... ja... genau... alles sehr monadisch... :gruebel: :lol:
jedenfalls danke für die hilfe. ich denke damit kommm ich erstmal weiter und nachdem ich jetzt auch noch weiß, was monadisch und EBNF ist, bin ich gebildet genug :D

lg

EDIT:

ist euch schon aufgefallen das ich smilies liebe :D