2009-06-24 17 views
34

Sto utilizzando Notepad ++ per eseguire la sostituzione del testo in un file di linguaggio di 5453 righe. Il formato delle righe del file è:Regex per passare al caso di frase

variable.name = Variable Value Over Here, that''s for sure, Really 

doppio apostrofo è intenzionale.

Ho bisogno di convertire il valore in caso di frase, ad eccezione delle parole "Qui" e "Realmente" che sono corrette e dovrebbero rimanere in maiuscolo. Come puoi vedere, il caso all'interno del valore è in genere misto all'inizio.

Ho lavorato su questo per un po '. Tutto quello che ho ottenuto finora è:

(.)([A-Z])(.+) 

che sembra almeno selezionare le stringhe corrette. Il pezzo di ricambio è dove sto lottando.

+7

Perché "Qui" e "Realmente" sono corretti? –

risposta

10

La sostituzione del regex non può eseguire la funzione (come la maiuscola) nelle partite. Dovresti copiarlo, ad es. in PHP o JavaScript.

Aggiornamento: Vedere Jonas' answer.

mi sono costruito una pagina Web chiamato Text Utilities a fare questo genere di cose:

  • incollare il testo
  • andare in "Trova, regexp & sostituire" (o premere Ctrl + Maiusc + F)
  • immettere il regex (mio sarebbe ^(.*?\=\s*\w)(.*)$)
  • Selezionare l'opzione "^ $ partita linea limiti"
  • scegliere "Applica la funzione JS per le partite"
  • aggiungere argomenti (prima è la partita, poi i modelli sub), qui s, start, rest
  • cambiamento l'istruzione return per return start + rest.toLowerCase();

la funzione finale nell'area di testo si presenta così:

return function (s, start, rest) { 
    return start + rest.toLowerCase(); 
}; 

Forse aggiungere del codice di capitalizzare alcune parole come "Davvero" e "Qui".

+0

Grazie per l'aiuto streetpc. In Notepad ++ posso applicare la funzione replace usando regex che è suh-weet. Poi di nuovo, anche il tuo sito è suh-weet. Questo praticamente lo inchioda a meno che non abbia una nuova frase all'interno della parte variabile, ma posso correggerlo trovando ". [A-z]" e fissando il caso sulla prima lettera che segue una combinazione periodo-spazio. Ho intenzione di lasciare aperta la domanda per un po 'per vedere se qualcuno risponde a Notepad ++ ma hai sicuramente risolto il mio problema. Grazie! – jkramp

+0

Prego :) –

+0

Questo può essere fatto in Vim. http://vim.wikia.com/wiki/Changing_case_with_regular_expressions – MaxH

6

In Notepad ++ è possibile utilizzare un plug-in chiamato PythonScript per eseguire il lavoro. Se si installa il plugin, creare un nuovo script in questo modo:

enter image description here

quindi è possibile utilizzare il seguente script, sostituendo le variabili regex e funzioni come meglio credi:

import re 

#change these 
regex = r"[a-z]+sym" 
function = str.upper 

def perLine(line, num, total): 
for match in re.finditer(regex, line): 
    if match: 
     s, e = match.start(), match.end() 
     line = line[:s] + function(line[s:e]) + line[e:] 
     editor.replaceWholeLine(num, line) 

editor.forEachLine(perLine) 

Questo particolare esempio funziona trovando tutte le partite in una particolare linea, quindi applicando la funzione ogni ciascuna corrisponde. Se hai bisogno di un supporto multilinea, lo script Python "Conext-Help" spiega tutte le funzioni offerte incluse le funzioni pymlsearch/pymlreplace definite sotto l'oggetto 'editor'.

Quando sei pronto per eseguire lo script, vai al file che desideri eseguire prima, quindi vai a "Script>" nel menu Script Python ed esegui il tuo.

Nota: mentre si sarà probabilmente in grado di utilizzare notepad 's funzionalità di undo ++ se sbagli, potrebbe essere una buona idea mettere il testo in un altro file prima di procedere al funziona.

P.S. Puoi 'trovare' e 'segnare' ogni occorrenza di un'espressione regolare usando la finestra di dialogo di ricerca incorporata di notepad ++, e se puoi selezionarli tutti puoi usare la funzionalità "Caratteri-> MAIUSCOLO" di TextFX per questo particolare problema, ma io Non sono sicuro di come passare dal testo contrassegnato o trovato al testo selezionato. Ma, ho pensato di pubblicare questo nel caso qualcuno fa ...

Edit: In Notepad ++ 6.0 o superiore, è possibile usare "PCRE (Perl Compatible Regular Expression) Ricerca/Sostituisci" (fonte: http://sourceforge.net/apps/mediawiki/notepad-plus/?title=Regular_Expressions) Così questo avrebbe potuto essere risolto usando una regex come (.)([A-z])(.+) con un argomento sostitutivo come \1\U\2\3.

+0

Per coloro che cercano un buon riferimento alla ricerca PCRE e sostituiscono la sintassi (inclusa la conversione del caso ecc.), Si può guardare questo sito Perldoc: http://perldoc.perl.org/perlre.html - - Non sono stato in grado di trovare nessun altro luogo in cui cose come '\ U' sono state documentate! –

123
Find: (.)([A-Z])(.+) 
Replace: \1\U\2\L\3 

In Notepad ++ 6.0 o superiore (che viene fornito con built-in PCRE supporto).

+2

Oh wow, ho voluto qualcosa di simile per così tanto tempo. Grazie!! –

+24

Aggiungerò che '\ u' le maiuscole solo il primo carattere della partita. Allo stesso modo '\ l' sarà in minuscolo solo il primo carattere. –

+6

Questa dovrebbe essere la risposta. – sonnb

3

L'intervistatore aveva in mente un caso molto specifico. In generale "modifica al caso di frase" nel blocco note ++ il primo suggerimento di regexp non ha funzionato correttamente per me. pur non essendo perfetta, qui è una versione ottimizzato, che è stato un grande miglioramento rispetto l'originale per i miei scopi:

find: ([\.\r\n][ ]*)([A-Za-z\r])([^\.^\r^\n]+) 
replace: \1\U\2\L\3 

Hai ancora un problema con sostantivi minuscole, nomi, date, paesi, ecc ma una buona correttore ortografico può aiutare con quello.

+0

grazie! \ U ha funzionato per me. Avevo bisogno di cambiare un gruppo di nomi variabili da underscore a caso cammello, poi in sublime ho cercato l'espressione (. +) _ (. +) (<- questo non è un baby monster eyes) e lo ho rimpiazzato con $ 1 \ U $ 2 – Eugenio

Problemi correlati