Quel Regex capturerait tout, de la marque à la fin d'une ligne?


123

J'ai un fichier texte qui dénote des remarques avec un seul '.

Certaines lignes ont deux guillemets mais j'ai besoin de tout obtenir de la première instance de a 'et du saut de ligne.

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

Réponses:


171
'.*

Je pense que vous avez besoin de l'option Multiline.


3
Cela capturera la première instance du personnage et la fin de la dernière ligne
killdaclick

90

L'expression régulière appropriée serait le 'char suivi d'un nombre quelconque de caractères [y compris zéro caractère] se terminant par un jeton de fin de chaîne / ligne:

'.*$

Et si vous vouliez tout capturer après le 'char mais ne pas l'inclure dans la sortie, vous utiliseriez:

(?<=').*$

Cela dit essentiellement de me donner tous les caractères qui suivent le 'char jusqu'à la fin de la ligne.

Edit : Il a été noté que $ est implicite lors de l'utilisation de. * Et donc pas strictement requis, donc le modèle:

'.* 

est techniquement correct, mais il est plus clair d'être précis et d'éviter toute confusion pour la maintenance ultérieure du code, d'où mon utilisation du $. Je pense qu'il est toujours préférable de déclarer un comportement explicite que de se fier à un comportement implicite dans des situations où la clarté pourrait être remise en question.


1
Le $ est inutile. Le point s'arrêtera à la fin de la ligne dans des circonstances normales.
Tomalak

7
inutile - mais adapté à ce qu'il veut faire. Cela sert de rappel plus tard qu'il attend tout du 'au bout de la ligne
gnarf

@balabaster: Je n'ai pas dit que c'était mal. ;-) C'était juste une note de bas de page.
Tomalak

@Tomalak: Je n'essayais en aucun cas d'impliquer que vous aviez tort, je clarifiais simplement mon raisonnement sur mon choix d'utiliser $ plutôt que non. Je vous remercie de le faire remarquer.
BenAlabaster

+1 pour inclure comment tout inclure après le personnage en question, au lieu de toujours l'inclure.
grizzasd

22
'.*$

En commençant par un guillemet simple ( '), faites correspondre n'importe quel caractère ( .) zéro fois ou plus ( *) jusqu'à la fin de la ligne ( $).


Cette réponse est un excellent exemple de la façon de décomposer la logique derrière quelle commande, belle et claire!
Timmah

12

Quand j'ai essayé '. * Dans Windows (Notepad ++), tout correspondrait après le premier' jusqu'à la fin de la dernière ligne.

Pour tout capturer jusqu'à la fin de cette ligne, j'ai tapé ce qui suit:

'.*?\n

Cela ne capturerait que tout de «jusqu'à la fin de cette ligne.


6

Dans votre exemple, je choisirais le modèle suivant:

'([^\n]+)$

utilisez des options multilignes et globales pour faire correspondre toutes les occurrences.

Pour inclure le saut de ligne dans la correspondance, vous pouvez utiliser:

'[^\n]+\n

Mais cela peut manquer la dernière ligne s'il n'a pas de saut de ligne.

Pour une seule ligne, si vous n'avez pas besoin de faire correspondre le saut de ligne, je préférerais utiliser:

'[^$]+$

4

Cela capturera tout jusqu'à la référence arrière 1 - et tout après la référence arrière 2. Vous devrez peut-être échapper aux apostrophes en fonction de la langue (\ ')

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

Modification rapide: si la ligne n'a pas de '- backreference 1 devrait quand même attraper toute la ligne.

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

Je suis sûr que celui-ci fonctionne, il capturera de hexa serial dans le texte multiliné mal structuré ci-dessous

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

Je suis un éternel débutant en regex mais je vais essayer d'expliquer celui-ci

(\ w * (Hex): w *): Rechercher le texte dans la ligne où la chaîne contient "Hex:"

(. *?) Ceci est le deuxième texte capturé et signifie tout après

(? = | $) crée une limite qui est l'espace entre = et le |

Donc avec le deuxième groupe, vous aurez la valeur


Ce n'est pas la question, n'est-ce pas?
Daniel E.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.