¿Qué Regex capturaría todo, desde 'marca hasta el final de una línea?


122

Tengo un archivo de texto que denota comentarios con un solo '.

Algunas líneas tienen dos comillas, pero necesito obtener todo, desde la primera instancia de ay el salto de 'línea.

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

Respuestas:


169
'.*

Creo que necesitas la opción, Multiline.


3
Esto capturará la primera instancia del carácter 'y el final de la última línea
killdaclick

90

La expresión regular apropiada sería el 'char seguido de cualquier número de caracteres [incluidos cero caracteres] que terminen con un token de final de cadena / línea:

'.*$

Y si quisiera capturar todo después del 'char pero no incluirlo en la salida, usaría:

(?<=').*$

Esto básicamente dice que me den todos los caracteres que siguen al 'char hasta el final de la línea.

Editar : Se ha notado que $ está implícito cuando se usa. * Y por lo tanto no es estrictamente necesario, por lo tanto, el patrón:

'.* 

es técnicamente correcto, sin embargo, es más claro ser específico y evitar confusiones para el mantenimiento posterior del código, de ahí mi uso de $. Creo que siempre es mejor declarar un comportamiento explícito que confiar en un comportamiento implícito en situaciones en las que se puede cuestionar la claridad.


1
El $ es innecesario. El punto se detendrá al final de la línea en circunstancias normales.
Tomalak

7
innecesario, pero adecuado para lo que quiere hacer. Sirve como un recordatorio más tarde de que está esperando todo desde 'hasta el final de la línea
gnarf

@balabaster: No dije que estuviera mal. ;-) Era solo una nota al pie.
Tomalak

@Tomalak: No estaba tratando de insinuar que estaba equivocado de ninguna manera, solo estaba aclarando mi razonamiento sobre mi elección de usar $ en lugar de no. Gracias por señalarlo.
BenAlabaster

+1 por incluir cómo incluir todo después del personaje en cuestión, en lugar de incluirlo siempre.
Grizzasd

22
'.*$

Comenzando con una comilla simple ( '), haga coincidir cualquier carácter ( .) cero o más veces ( *) hasta el final de la línea ( $).


Esta respuesta es un gran ejemplo de cómo romper la lógica detrás de qué comando, ¡agradable y claro!
Timmah

12

Cuando probé '. * En Windows (Notepad ++), coincidiría con todo después del primero' hasta el final de la última línea.

Para capturar todo hasta el final de esa línea escribí lo siguiente:

'.*?\n

Esto solo capturaría todo desde 'hasta el final de esa línea.


6

En su ejemplo, optaría por el siguiente patrón:

'([^\n]+)$

use opciones multilínea y globales para hacer coincidir todas las ocurrencias.

Para incluir el salto de línea en el partido, puede utilizar:

'[^\n]+\n

Pero esto podría perder la última línea si no tiene salto de línea.

Para una sola línea, si no necesita hacer coincidir el salto de línea, preferiría usar:

'[^$]+$

4

Esto capturará todo hasta el 'in backreference 1 - y todo lo que esté después del' in backreference 2. Es posible que deba escapar de los apóstrofos, aunque dependiendo del idioma (\ ')

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

Modificación rápida: si la línea no tiene un '- backreference 1 aún debería atrapar toda la línea.

^ - 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

Estoy seguro de que este funciona, capturará la serie hexa en el texto mal estructurado de varias líneas debajo

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

Soy un eterno novato en expresiones regulares, pero intentaré explicar este

(\ w * (Hex): w *): busca texto en la línea donde la cadena contiene "Hex:"

(. *?) Este es el segundo texto capturado y significa todo después

(? = | $) crea un límite que es el espacio entre = y |

Entonces, con el segundo grupo, tendrá el valor


Esa no es la pregunta, ¿verdad?
Daniel E.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.