2013-02-05 14 views
6

voglio dividere un attributo border da CSS nelle sue parti costituenti e cioè:Regex per attribuire la scissione confine CSS nelle sue parti

.someClass{ 
    border: 1px solid black; 
} 

Into

border-width: 1px 
border-style: solid; 
border-color: black; 

Ho diviso fuori confine: e punto e virgola prima di questo, quindi ho semplicemente bisogno di analizzare la sezione del valore dell'attributo

Ora in CSS è possibile avere qualsiasi combinazione dei 3 attributi sopra presenti così

border: 1px solid; 
border: solid Gold; 
border: 1em; 
border: 1mm #000000; 
border: 1px inset rgb(12, 44, 199); 

Tutti sono legali, quindi devo tenerne conto.

Quello che ho finora è

([0-9]+[a-zA-Z|%]+)* *([a-zA-Z]*) *(.*) 

che funziona bene per il caso normale, ma non riesce sul caso "1px solid", come solido viene messo in 3 ° gruppo di cattura, non il secondo. Non sono un esperto di regex, quindi potrei fare degli errori molto semplici, ma qualsiasi aiuto sarebbe molto apprezzato. Sto lavorando con C# (ma sono state principalmente testate in http://gskinner.com/RegExr/ quindi eventuali differenze potrebbero essere state il problema)

risposta

1

Semplicemente incluso border: all'inizio dell'espressione sembra essere un aiuto importante poiché non accidentalmente corrisponderà al secondo o terzo gruppo. Allo stesso modo, aggiungere ; alla fine dell'espressione impedisce l'acquisizione del secondo o terzo gruppo troppo presto. Oltre a questo, anche il cambio del secondo gruppo da * a + aiuta perché consente di abbinare il secondo gruppo come previsto piuttosto che il terzo. Complessivamente, provate questo:

border: ([0-9]+[a-zA-Z|%]+)* *([a-zA-Z]+)* *(.*)*; 

Dubito che questo è perfetto e se avete bisogno di risultati a lavorare al 100%, probabilmente non dovrebbe utilizzare una singola espressione regolare, ma invece tokenize e analizzare la stringa (dubito fortemente regole CSS sono analizzati interamente con regex), ma se questo funziona per le regole limitate ne hai bisogno per poi grandi.

+0

Grazie, sembra funzionare bene per me e ottiene risultati abbastanza accurati per me. – Nymain