none
String erweitern

    Frage

  • Hallo zusammen,

    ich habe einen String: d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5

    Überall, wo nur ein Buchstabe oder eine Zahl steht, soll eine 0 vorangestellt werden. D.h., wie schaffe ich es daraus 0d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,0a,3b,05 zu machen?

    Ein einfacher Replace bringt mir nichts, da die Zeichen unterschiedlich sind und in einem anderen String an unterschiedlichen Stellen stehen können.

    VG

    Montag, 5. März 2018 16:23

Antworten

  • Eigentlich ganz einfach: Du zerlegst den langen String einfach an den Kommata in Einzelstrings ... Du splittest ihn also. Dann kannst Du alle Einzel-Strings auf ihre Länge prüfen und wenn die nur 1 ist, dann hängst Du vorne eine Null an. Dann verbindest Du die Einzelstrings wieder zu einem Großen ... Du joinst sie also wieder.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Gahmuret Freitag, 9. März 2018 09:36
    Montag, 5. März 2018 19:01
  •    

    Oder mit ein bischen Regex-Magic ;-) :

    "d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5" -replace '(^|,|\G)([a-z]|[0-9])($|,)','${1}0${2}${3}'  
       

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Dienstag, 6. März 2018 00:56
    Moderator
  • Geht es nicht auch einfacher? Oder übersehe ich da was?
    "d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5" -replace "\b([a-z0-9])\b", '0$1'

    Dienstag, 6. März 2018 07:08
  • Na jetzt geht's aber los hier.  :-D  ... ich hab auch noch einen mit regex als Ergänzung zu Deinem:
    "d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5" -replace "\b(\w)\b", '0$1'


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    Dienstag, 6. März 2018 07:21

Alle Antworten

  • Eigentlich ganz einfach: Du zerlegst den langen String einfach an den Kommata in Einzelstrings ... Du splittest ihn also. Dann kannst Du alle Einzel-Strings auf ihre Länge prüfen und wenn die nur 1 ist, dann hängst Du vorne eine Null an. Dann verbindest Du die Einzelstrings wieder zu einem Großen ... Du joinst sie also wieder.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort markiert Gahmuret Freitag, 9. März 2018 09:36
    Montag, 5. März 2018 19:01
  •    

    Oder mit ein bischen Regex-Magic ;-) :

    "d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5" -replace '(^|,|\G)([a-z]|[0-9])($|,)','${1}0${2}${3}'  
       

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Dienstag, 6. März 2018 00:56
    Moderator
  • Spielverderber! Ich wollte wenigstens warten bis er sich wieder meldet. ;-)  ... aber wenn wir jetzt schon beim Basteln sind - ich bin auf das hier gekommen:
    ('d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5' -split ',' | ForEach-Object {$_ -replace '^(.)$',"0`$1"} ) -join ','


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 6. März 2018 01:10
  • Auch schön. Aber mit zwei Befehlen und Pipeline.. pfff kann ja jeder. ;-)

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Dienstag, 6. März 2018 01:20
    Moderator
  • Geht es nicht auch einfacher? Oder übersehe ich da was?
    "d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5" -replace "\b([a-z0-9])\b", '0$1'

    Dienstag, 6. März 2018 07:08
  • Oder übersehe ich da was?

    Nein, tust Du offenbar nicht. Cool.

    Jetzt haben wir natürlich Gahmuret der Möglichkeit beraubt, das alles allein rauszuknobeln. 

    Tut mir leid, Gahmuret.   ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 6. März 2018 07:13
  • Ein etwas variablerer Weg wäre die Benutzung der String.PadLeft-Methode:

    ("d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5" -split "," | foreach{$_.padleft(2,"0")}) -join ","

    Damit kann man auf beliebige Länge erweitern und das dafür verwendete Zeichen wählen.

    Dienstag, 6. März 2018 07:14
  • Na jetzt geht's aber los hier.  :-D  ... ich hab auch noch einen mit regex als Ergänzung zu Deinem:
    "d,16,cc,f9,61,70,d2,4f,ae,db,a7,4f,df,a,3b,5" -replace "\b(\w)\b", '0$1'


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    Dienstag, 6. März 2018 07:21
  • Na jetzt geht's aber los hier.  :-D   


    OK, fehlt noch das Wort zum Sonntag ;-)

    Gemittelt über 10 Durchgänge über jeweils 10.000 Strings, jedes bestehend aus 12 Elementen, ergibt sich das folgende Performance-Bild (in Millisekunden):

    Olafs RegEx:      116.36045
    Christophs RegEx: 102.25861
    Dennivers RegEx:  115.44516
    PadLeft:          1945.05935


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 6. März 2018 09:19
  • Damit habe ich es geschafft, sowohl die schnellste als auch die langsamste Lösung vorzuschlagen. Das hat auch irgendwie was. ;-)
    Dienstag, 6. März 2018 11:05
  • Wenn ich gewusst hätte, das das ein Wettbewerb wird... :)
    Sollten wir vielleicht öfters mal veranstalten. Posh-Regex-Games oder so...

    Ich hoffe nur wir haben den OP nicht komplett abgehängt. Gahmuret?


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Dienstag, 6. März 2018 11:38
    Moderator
  • Damit habe ich es geschafft, sowohl die schnellste als auch die langsamste Lösung vorzuschlagen. Das hat auch irgendwie was. ;-)
    Naja, die von Olaf ursprünglich in Form einer Textaufgabe vorgeschlagene explizite Prüfung der Länge wäre vermutlich noch etwas langsamer geworden ;-)

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 6. März 2018 12:06
  • Na klar ... jetzt war ich's wieder. ;-)  Ich wollte ja eigentlich Gahmuret nur dazu animieren, mit dem Coden erstmal anzufangen. Jetzt haben wir ihm das ja schon alles abgenommen. Ich hab halt den pädagogischen Aspekt immer noch im Hinterkopf.  .... und manchmal ist die Geschwindigkeit auch gar nicht so wichtig. :-P  ... so.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 6. März 2018 13:43
  • Falls Gahmuret noch nicht schreiend davon gerannt ist, könnte er zumindest die schönsten Antworten markieren und somit prämieren :-)  
    Dienstag, 6. März 2018 13:44
  • Wow...hier geht es ja ab. Durch die Flut der Antworten bin ich leider nicht dazu gekommen alle durchzulesen, es scheint aber, als wäre das für alle Beteiligten recht kurzweilig gewesen.

    Frei nach dem Motto: alle Wege führen nach Rom, gehe ich davon aus, dass alle mit ihren Antworten Recht haben! :-)

    Aber ernsthaft, vielen Dank für die Antworten. Nr 1 hat mir schon auf die Sprünge geholfen.

    Beste Grüße

    Freitag, 9. März 2018 09:36