2009-05-06 3 views
60

Ho un file di testo che denota osservazioni con un singolo '.Cosa Regex catturerebbe ogni cosa dal 'marchio alla fine di una linea?

Alcune righe hanno due virgolette ma è necessario ottenere tutto dalla prima istanza di ' e il feed di riga.

I AL01     ' A-LINE       '091398 GDK 33394178  
     402922 0831850 '         '091398 GDK 33394179  
I AL02     ' A-LINE       '091398 GDK 33394180  
     400722 0833118 '         '091398 GDK 33394181  
I A10A     ' A-LINE 102      ' 53198 DJ 33394182  
     395335 0832203 '         ' 53198 DJ 33394183  
I A10B     ' A-LINE 102      ' 53198 DJ 3339418 

risposta

68
'.* 

Credo che tu abbia bisogno dell'opzione, Multiline.

61

L'espressione regolare appropriata sarebbe la 'char seguita da un numero qualsiasi di eventuali caratteri [compresi gli zero caratteri] che terminano con una fine della stringa/linea di token:

'.*$ 

e se si voleva catturare tutto dopo del 'char, ma non include in uscita, si userebbe:

(?<=').*$ 

Questo dice in sostanza mi danno tutti i caratteri che Fo lascia il segno fino alla fine della linea.

Edit:. Si è osservato che $ è implicita nell'uso * e quindi non strettamente necessario, quindi il modello:

'.* 

è tecnicamente corretto, ma è chiaro specifico e evitare confusione per la successiva manutenzione del codice, quindi il mio uso del $. Sono convinto che sia sempre meglio dichiarare un comportamento esplicito piuttosto che fare affidamento su comportamenti impliciti in situazioni in cui la chiarezza potrebbe essere messa in discussione.

+1

Il $ non è necessaria. Il punto si fermerà alla fine della linea in circostanze normali. – Tomalak

+7

inutile, ma adatto a quello che vuole fare. Serve come promemoria dopo che si aspetta tutto dalla 'alla fine della riga – gnarf

+0

@balabaster: non ho detto che era sbagliato. ;-) Era solo una nota a piè di pagina. – Tomalak

15
'.*$ 

Partendo da una singola citazione ('), qualsiasi carattere (.) zero o più volte (*) fino alla fine della linea ($).

+0

Mi piace la tua spiegazione concisa. Grazie! – EdwardM

2

Ciò catturare tutto fino alla 'in backreference 1 - e tutto ciò dopo il' in backreference 2. Potrebbe essere necessario sfuggire alle apostrofi anche se a seconda della lingua (\ ')

/^([^']*)'?(.*)$/ 

modifica rapida: se la linea non ha un '- backreference 1 dovrebbe comunque catturare l'intera linea.

4

Quando ho provato '. * In Windows (Notepad ++) corrispondeva a tutto dopo il primo' fino alla fine dell'ultima riga.

catturare tutto fino alla fine di quella linea ho digitato il seguente:

'.*?\n 

Questo sarebbe solo catturare tutto, dai 'fino alla fine di quella linea.

2

Nel tuo esempio mi piacerebbe andare per il seguente schema:

'([^\n]+)$ 

uso multilinea e opzioni globali per abbinare tutte le occorrenze.

Per includere l'avanzamento nella partita si potrebbe usare:

'[^\n]+\n 

Ma questo potrebbe perdere l'ultima riga se non ha avanzamento riga.

Per una singola linea, se non è necessario che corrisponda al linefeed preferisco usare:

'[^$]+$ 
Problemi correlati