2013-07-08 9 views
8

muszę zmodyfikować klucze pliku wartość klucza w następujący sposób:Wymień "1Don't zrobić" z "_1Don_t_do_that"

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

do

"_1Don_t_do_that" = "some value" 
  • prepend z podkreśleniem jeśli ciąg zaczyna się od numeru
  • zastępuje dowolny niealfanumeryczny znak znakiem podkreślenia
  • nie zmieniaj łańcucha wartości

mogę zrobić to w kilku etapach, jeśli to konieczne

Próbowałem rzeczy jak \"\w+[^\w]\w+\" = ale nie uwzględnia wielu miejscach i nie pojedyncze lub podwójne cudzysłowy.

Każda pomoc jest mile widziane.

+2

+1 za dostateczne wyjaśnienie celu i pokazanie, co próbowałeś. – christopher

+3

Jakiego języka/smaku używasz? – HamZa

+2

Twój przykładowy przykład nie ma "" pomiędzy "=" i "jakiś" - czy to niedopatrzenie, czy część twojego wymagania? – Philipp

Odpowiedz

3

Zakładając, że żaden z cytatami są uciekł, to powinno działać:

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

Dopasowuje

  • albo położenia między " i cyfry
  • lub znaków innych niż alfanumeryczne (z wyjątkiem cytatu),

, ale tylko jeśli są następnie pojedynczy cytat i znak równości.

See it live on regex101.

+0

Dzięki. W końcu napisałem mały program w Javie, aby poradzić sobie z tym zadaniem i działa zadziwiająco dobrze. – znat

1

Nie jestem pewien, co regex używa smak Xcode, ale pod warunkiem, że obsługuje pozytywny uprzedzona (?=), ta seria zamienników powinno działać:

  1. Prepend z podkreśleniem jeśli ciąg rozpoczyna się od numeru
    • znalezisko: ^"(?=\d)
    • wymienić wszystkich: "_
  2. Wymień non alfanumeryczny znak z podkreśleniem, upewniając się, że ciąg wartości jest po, a nie częścią tego, co zmieniamy.
    • znalezisko: [^a-zA-Z0-9](?=[^"]*"\s*=\s*"[^"]*")
    • wymienić wszystkich: _

Drugi etap zakłada, że ​​cudzysłowów nie występują w łańcuchu wartości; powiedz mi, czy potrzebujesz obsługiwać znaki cudzysłowu z odwróconym ukośnikiem.

+1

Dziękuję za odpowiedź, naprawdę doceniam czas, który zabrałeś. Niestety nie działało dokładnie tak, jak oczekiwano w Xcode, ponieważ dopasowano początkowy cytat. – znat