2012-11-28 11 views
8

Sto cercando di sostituire i metodi pubblici con metodi protetti per metodi che hanno un commento.Trova sostituisci gruppi denominati regexp in geany

Questo perché sto usando phpunit per testare alcuni di questi metodi, ma in realtà non hanno bisogno di essere pubblici, quindi mi piacerebbe accenderli sul server di produzione e tornare indietro durante i test.

Ecco la dichiarazione di metodo:

public function extractFile($fileName){ //TODO: change to protected 

Questa è la regexp:

(?<ws>^\s+)(?<pb>public)(?<fn>[^/\n]+)(?<cm>//TODO: change to protected) 

Se sostituisco con:

\1protected\3\//TODO: change back to public for testing 

E sembra funzionare, ma quello che ho non riesco a mettermi al lavoro è il nome con cui sostituire. Devo usare \ 1 per ottenere il primo gruppo. Perché nominare i gruppi se non riesci ad accedervi nei testi sostitutivi? Ho provato cose come \, $ ws, \ $ ws ma non funziona.

La mia domanda è: Qual è il testo sostitutivo se voglio sostituire \ 1 con il gruppo denominato?

+0

Grazie, non l'ho fatto però. Non riesco a trovarlo da nessuna parte nella documentazione. Se riesci a nominare i gruppi, potresti pensare di poterlo utilizzare nella stringa di sostituzione. Solitamente vado a votare qualsiasi risposta che sia utile, ora vedo che puoi accettarlo anche tu. Lo farà ora. – HMR

risposta

6

La sintassi del gruppo con nome ?<ws> è la stessa utilizzata da .NET/Perl. Per i motori regex il riferimento alla stringa di sostituzione per il gruppo indicato è ${ws}. Ciò significa che la stringa di sostituzione sarebbe:

${ws}protected${fn}\//TODO: change back to public for testing

Il \k<ws> riferimento fornita dal m.buettner viene utilizzato solo per backreference nella regex effettivo.

Extra Info:

Sembra come geany permette anche l'uso di stile Python chiamato gruppi:

  • ?P<ws> è la sintassi cattura
  • \g<ws> è la sintassi di stringa di sostituzione
  • (?P=ws) è la sintassi backreference di regex

EDIT:

Sembra la mia speranza per una soluzione non pan fuori. Da ,

"Un subpattern può essere denominato in uno dei tre modi: (? ...) o (? 'Nome' ...) come in Perl, o (? P ...) come in Python. Riferimenti per l'acquisizione di parentesi da altre parti del modello, come backreferences, ricorsione e condizioni, possono essere effettuate da nome e dal numero ".

E più in basso:

"riferimenti Indietro a nome sottopattern utilizzare la sintassi \ k o \ k'name Perl' o la sintassi Python (P = nome?)."

e

'Un subpattern a cui fa riferimento nome può essere visualizzato nella modello prima o dopo il riferimento.'

Quindi, la mia deduzione della sintassi per l'utilizzo di nome i gruppi erano corretti, ma possono essere utilizzati solo nel modello corrispondente, che risponde alla tua domanda "Perché nome gruppi ...?"

Quanto è stupido? implementare i gruppi con nome e il loro utilizzo nel modello di corrispondenza, perché non implementare anche l'utilizzo nella stringa di sostituzione?

+0

Grazie per la risposta. Forse ho un diverso geany ma se ho il testo "win7" usando expression "(? win) 7" sostituendo con: "$ {w} 8" il risultato è: "$ {w} 8" usando geany 1.22 – HMR

+0

@ HMR - In realtà non ho geany. Ho osservato che la sintassi di cattura era la stessa di .NET/Perl, che è stata confermata quando ho controllato il manuale online in quanto entrambi consentono anche "?" Ws''. Speravo che il motore regex sottostante avrebbe permesso lo stesso stile chiamato cattura nella stringa di sostituzione. Ho appena fatto qualche altra lettura del manuale. Sembra che i gruppi nominati siano _non_ consentiti nella stringa di sostituzione. Modificherò la mia risposta per includere ulteriori dettagli. – robinCTS

+0

Grazie per il tempo dedicato a esaminare questo. Non ho trovato nulla nella documentazione sulla stringa di sostituzione, ma voglio essere sicuro di non aver trascurato qualcosa prima di escluderlo. – HMR