2013-07-08 4 views
8

Ich brauche die Schlüssel einer Schlüsselwert-Datei wie folgt zu ändern:Ersetzen "1Don't tun" mit "_1Don_t_do_that"

"1Don't do that" = "some value" 

zu

"_1Don_t_do_that" = "some value" 
  • prepend mit Unterstrich, wenn Zeichenfolge beginnt mit einer Nummer
  • Ersetzen Sie alle nicht alphanumerischen Zeichen durch Unterstriche
  • ändern Sie nicht die Wert Zeichenfolge

Ich kann es in mehreren Schritten tun, wenn nötig

Ich habe versucht, Dinge wie \"\w+[^\w]\w+\" = aber es berücksichtigt nicht für mehrere Räume und nicht einfache oder doppelte Anführungszeichen.

Jede Hilfe ist willkommen.

+2

+1 für das Erklären Ziel ausreichend, und zeigen, was Sie versucht haben. – christopher

+3

Welche Sprache/welchen Geschmack verwendest du? – HamZa

+2

Ihr Beispiel hat kein '' 'zwischen' = 'und' einige' - ist das ein Versehen oder ein Teil Ihrer Anforderung? – Philipp

Antwort

3

Unter der Annahme, dass keine Ihrer Anführungszeichen entgangen sind, sollte diese Arbeit:

(?:(?<=")(?=\d)|[^\w"])(?=[^"]*"\s*=) 

Das passt

  • entweder die Position zwischen " und einer Ziffer
  • oder ein nicht-alphanumerischen Zeichen (außer einem Zitat),

aber nur wenn sie sind gefolgt von einem einfachen Anführungszeichen und einem Gleichheitszeichen.

See it live on regex101.

+0

Danke. Ich habe schließlich ein kleines Programm in Java geschrieben, um diese Aufgabe zu bewältigen, und es funktioniert erstaunlich gut. – znat

1

Ich bin nicht sicher, welche regex Geschmack Xcode verwendet, aber solange es positive Vorschau unterstützt (?=), soll diese Reihe von Ersatz arbeiten:

  1. Prepend mit Unterstrich, wenn der String mit einer Zahl beginnt
    • Fund: ^"(?=\d)
    • ersetzen alle: "_
  2. alle nicht ersetzen Alphanumerisches Zeichen mit Unterstrich. Achten Sie darauf, dass die Wertzeichenfolge nicht geändert wird.
    • Fund: [^a-zA-Z0-9](?=[^"]*"\s*=\s*"[^"]*")
    • ersetzen alle: _

Der zweite Schritt setzt voraus, dass Anführungszeichen nie in der Wertzeichenfolge auftreten; Sag mir, ob du mit Backslash-Code umgehen musst.

+1

Vielen Dank für Ihre Antwort, ich schätze die Zeit, die Sie genommen haben. Leider funktionierte es auf Xcode nicht genau so wie erwartet, da das Eröffnungsangebot angepasst wurde. – znat