Quale Regex catturerebbe tutto, dal segno alla fine di una riga?


123

Ho un file di testo che denota commenti con un singolo '.

Alcune righe hanno due virgolette ma ho bisogno di ottenere tutto dalla prima istanza di ae 'l'avanzamento 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

Risposte:


171
'.*

Credo che tu abbia bisogno dell'opzione, Multiline.


3
Questo catturerà la prima istanza del carattere 'e la fine dell'ultima riga
killdaclick il

90

La regex appropriata sarebbe il 'char seguito da un numero qualsiasi di caratteri [inclusi zero chars] che terminano con la fine della stringa / riga:

'.*$

E se volessi catturare tutto dopo il carattere 'char ma non includerlo nell'output, dovresti usare:

(?<=').*$

Questo fondamentalmente dice dammi tutti i caratteri che seguono il carattere 'fino alla fine della riga.

Modifica : è stato notato che $ è implicito quando si usa. * E quindi non strettamente richiesto, quindi il modello:

'.* 

è tecnicamente corretto, tuttavia è più chiaro essere specifici ed evitare confusione per la successiva manutenzione del codice, da qui il mio uso di $. È mia convinzione che sia sempre meglio dichiarare un comportamento esplicito piuttosto che fare affidamento su un comportamento implicito in situazioni in cui la chiarezza potrebbe essere messa in dubbio.


1
$ Non è necessario. Il punto si fermerà alla fine della riga in circostanze normali.
Tomalak

7
inutile, ma adatto a ciò che vuole fare. Serve come promemoria in seguito che si aspetta tutto dall 'alla fine della riga
gnarf

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

@Tomalak: Non stavo cercando di implicare che ti sbagliavi in ​​alcun modo, stavo solo chiarendo il mio ragionamento per la mia scelta di usare $ piuttosto che no. Grazie per averlo precisato.
BenAlabaster

+1 per includere come includere tutto dopo il personaggio in questione, invece di includerlo sempre.
grizzasd

22
'.*$

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


Questa risposta è un ottimo esempio di come abbattere la logica alla base di ciò che un comando, bello e chiaro!
Timmah

12

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

Per catturare tutto fino alla fine di quella riga ho digitato quanto segue:

'.*?\n

Questo catturerebbe solo tutto da 'fino alla fine di quella riga.


6

Nel tuo esempio sceglierei il seguente schema:

'([^\n]+)$

usa le opzioni multilinea e globali per abbinare tutte le occorrenze.

Per includere l'avanzamento riga nella corrispondenza puoi usare:

'[^\n]+\n

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

Per una singola riga, se non è necessario abbinare l'avanzamento riga, preferisco utilizzare:

'[^$]+$

4

Questo catturerà tutto fino a "nel backreference 1 - e tutto dopo il" nel backreference 2. Potrebbe essere necessario eseguire l'escape degli apostrofi anche se a seconda della lingua (\ ')

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

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

^ - start of string
([^']*) - capture any number of not ' characters
'? - match the ' 0 or 1 time
(.*) - capture any number of characters
$ - end of string

0

https://regex101.com/r/Jjc2xR/1

/(\w*\(Hex\): w*)(.*?)(?= |$)/gm

Sono sicuro che questo funziona, catturerà de hexa seriale nel muggito di testo strutturato male

     Space Reservation: disabled
         Serial Number: wCVt1]IlvQWv
   Serial Number (Hex): 77435674315d496c76515776
               Comment: new comment

Sono un eterno principiante in regex ma proverò a spiegare questo

(\ w * (Hex): w *): trova il testo nella riga in cui la stringa contiene "Hex:"

(. *?) Questo è il secondo testo catturato e significa tutto dopo

(? = | $) crea un limite che è lo spazio tra = e |

Quindi con il secondo gruppo, avrai il valore


Non è questa la domanda, vero?
Daniel E.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.