2017-01-25 2 views
1

Donné ce texte multiligne:regex: étant donné une chaîne multiligne, comment faire correspondre le texte inclus après une chaîne spécifiée positionnée au début de chaque ligne?

abc aaa 
bbb abc ccc 
abc ddd eee 
fff abc 

Je veux correspondre au abc mot au début de chaque ligne comme premier groupe correspondant, et le reste du texte avant la prochaineabc positionné au début de la ligne.

Donc, c'est le match de résultat attendu:

Match 1 
Full match `abc aaa 
bbb abc ccc` 

Group 1. `abc` 
Group 2. ` aaa 
      bbb abc ccc` 

Match 2 
Full match `abc ddd eee 
fff abc` 

Group 1. `abc` 
Group 2. ` ddd eee 
      fff abc` 

J'ai essayé cette regex (avec option multiligne):

/^(abc)([\w\s]+)/gm 

Mais le résultat est erroné car il prend le texte au total :

Match 1 
Full match `abc aaa 
bbb abc ccc 
abc ddd eee 
fff abc` 

Group 1. `abc` 
Group 2. ` aaa 
bbb abc ccc 
abc ddd eee 
fff abc` 

Comment puis-je corriger ma regex pour obtenir le résultat attendu?

Notez que le mot "abc" peut également se comparer au reste du "segment interne" de la chaîne.

Merci d'avance.

Répondre

2

Utilisez

/^(abc\b)(.*(?:\r?\n(?!abc\b).*)*)/gm 

Voir la regex demo

Détails:

  • ^ - début d'une ligne
  • (abc\b) - un mot entier abc (supprimer si vous \b ne pas besoin d'un mot entier)
  • (.*(?:\r?\n(?!abc\b).*)*) - Groupe 2 capture
    • .* - le reste de la ligne qui commence par abc
    • (?:\r?\n(?!abc\b).*)* - 0+ séquences de:
      • \r?\n(?!abc\b) - une ligne pause non suivie avec abc
      • .* - le reste de la ligne en cours.
+0

brillant! Ça marche! Merci beaucoup! –