Domanda

Questo non è così semplice come sembra. La maggior parte di voi sono probabilmente pensando alla /([A-Z])/_$1/ regex come ho trovato tutti su Internet, ma la mia particolare situazione è leggermente più complicato. La mia stringa di origine contiene più contenuti che I non Vuoi avere convertito prima di una parte che I do .

Si consideri un setter regolare:

public function setUserId()

Naturalmente, questo metodo non è presente un parametro. Forse ho molti di questi metodi. Mi piacerebbe trasformare quella linea in

public function setUserId($user_id)

che è una cosa piuttosto semplice da prendere in considerazione, ma non è così semplice come io rifletto più profondo. E 'simile a quello che Andreas_D in questa discussione , ma con la sfida di cercare di modificare in modo iterativo il nome della variabile ...

E 'probabilmente sarà una cosa ovvia usando le espressioni regolari, ma sono ancora abbastanza nuovo con loro. Ad ogni modo, non riesco a trovare una soluzione decente per questo problema ovunque nelle mie ricerche.

Edit: ovviamente, mi rendo conto che non ci sono capitali in "funzione pubblica", che lascia sul sicuro. Ma, questa ricerca e sostituzione saranno in esecuzione contro blocchi di codice, e voglio assicurare che la stringa sto modificato inizia con "funzione pubblica".

È stato utile?

Soluzione

Per prima ricerca di definizioni di funzioni, e poi su ogni partita, inserire un parametro in base al nome della funzione.

/\b(function\s+set([A-Z]\w*))\b\s*\(\)/g

Questo modello vi darà partite con la function-parola chiave e il nome della funzione nel gruppo 1, e la parte cammello prima lettera maiuscola del nome della funzione nel gruppo 2.

/([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))/g

Questo modello troverà l'ultima lettera prima di una sequenza di maiuscole / minuscole che compongono cammello e minuscole.

Lei non ha specificato in che lingua si prevede di utilizzare, ecco una dimostrazione utilizzando Python:

import re

pattern1 = re.compile(r'\b(function\s+set([A-Z]\w*))\b\s*\(\s*\)')
pattern2 = re.compile(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))')

def fix_setters(code):
    def replacer(match):
        var_name = pattern2.sub(r'\1_', match.group(2)).lower()
        return "%s($%s)" % (match.group(1), var_name)
    return pattern1.sub(replacer, code)

L'ultima riga ( "return pattern1.sub(replacer, code)"), utilizza un callback per generare il testo da sostituire. Ci dovrebbe essere una funzionalità simile nella maggior parte delle lingue.

Python (prima della versione 3.0) utilizza l'operatore modulo ( "%") per la formattazione, simile a sprintf a esempio il linguaggio C.

Esempio:

>>> s = """\
... public function setUserName() {
...   blaha
... }
... """
>>> print s
public function setUserName() {
  blaha
}

>>> print fix_setters(s)
public function setUserName($user_name) {
  blaha
}

>>>

Più informazioni: NET - Come è possibile dividere un “caps” stringa delimitata in una matrice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top