Qual Regex capturaria tudo desde 'marca até o fim de uma linha?

122

Eu tenho um arquivo de texto que denota comentários com um único '.

Algumas linhas têm duas aspas, mas preciso obter tudo desde a primeira instância de ae 'a alimentação de linha.

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
user38349
fonte

Respostas:

169
'.*

Eu acredito que você precisa da opção, Multiline.

Joshua Belden
fonte
3
Isso irá capturar a primeira instância do personagem 'e o final da última linha
killdaclick de
90

O regex apropriado seria o 'char seguido por qualquer número de quaisquer caracteres [incluindo zero caracteres] terminando com um token de fim de string / linha:

'.*$

E se você quisesse capturar tudo após o 'char, mas não incluí-lo na saída, você usaria:

(?<=').*$

Isso basicamente diz: dê-me todos os caracteres que seguem o 'char até o final da linha.

Editar : foi observado que $ está implícito ao usar. * E, portanto, não é estritamente necessário, portanto, o padrão:

'.* 

é tecnicamente correto, no entanto, é mais claro ser específico e evitar confusão para manutenção de código posterior, daí meu uso de $. Acredito que é sempre melhor declarar um comportamento explícito do que confiar em um comportamento implícito em situações em que a clareza pode ser questionada.

BenAlabaster
fonte
1
O $ é desnecessário. O ponto irá parar no final da linha em circunstâncias normais.
Tomalak
7
desnecessário - mas adequado para o que ele deseja fazer. Mais tarde, serve como um lembrete de que está esperando tudo desde 'até o fim da linha
gnarf
@balabaster: Eu não disse que estava errado. ;-) Foi apenas uma nota de rodapé.
Tomalak
@Tomalak: Não estava tentando dar a entender que você estava errado de forma alguma, estava apenas esclarecendo meu raciocínio para minha escolha de usar $ em vez de não usar. Obrigado por apontar isso.
BenAlabaster
+1 para incluir como incluir tudo após o personagem em questão, em vez de sempre incluí-lo.
grizzasd
22
'.*$

Começando com aspas simples ( '), combine qualquer caractere ( .) zero ou mais vezes ( *) até o final da linha ( $).

Gene Gotimer
fonte
Esta resposta é um ótimo exemplo de como quebrar a lógica por trás de um comando, bom e claro!
Timmah de
12

Quando tentei '. * No Windows (Notepad ++), ele iria corresponder a tudo depois da primeira' até o final da última linha.

Para capturar tudo até o final dessa linha, digitei o seguinte:

'.*?\n

Isso só capturaria tudo de 'até o final dessa linha.

dinamarquês
fonte
6

Em seu exemplo, eu escolheria o seguinte padrão:

'([^\n]+)$

use opções multilinha e globais para combinar todas as ocorrências.

Para incluir o avanço de linha na partida, você pode usar:

'[^\n]+\n

Mas isso pode perder a última linha se não houver alimentação de linha.

Para uma única linha, se você não precisar corresponder ao feed de linha, eu prefiro usar:

'[^$]+$
Gess
fonte
4

Isso irá capturar tudo até 'na referência anterior 1 - e tudo após' na referência anterior 2. Você pode precisar escapar dos apóstrofos, dependendo do idioma (\ ')

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

Modificação rápida: se a linha não tiver um '- referência anterior 1 ainda deve pegar a linha inteira.

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

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

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

Tenho certeza que este funciona, ele irá capturar o hexa serial no texto mal estruturado multilinhado abaixo

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

Eu sou um eterno novato em regex, mas vou tentar explicar este

(\ w * (Hex): w *): Encontre o texto na linha em que a string contém "Hex:"

(. *?) Este é o segundo texto capturado e significa tudo depois

(? = | $) cria um limite que é o espaço entre = e o |

Assim, com o segundo grupo, você terá o valor

Xavius ​​Pupuss
fonte
Essa não é a questão, é?
Daniel E.