2017-10-03 3 views
1

Je vais avoir le texte ci-dessous.Correspond à plusieurs lignes usent Regex

^0001 HeadOne 


@@ 
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theindustry's standard dummy text ever since the 1500s, when an unknown printer took a galley of typeand scrambled it to make a type specimen book. 

^0002 HeadTwo 


@@ 
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theindustry's standard dummy text ever since the 1500s, when an unknown printer took a galley of typeand scrambled it to make a type specimen book. 

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theindustry's standard dummy text ever since the 1500s, when an unknown printer took a galley of typeand scrambled it to make a type specimen book. 


^004 HeadFour 


@@ 
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. 

^0004 HeadFour 


@@ 
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theindustry's standard dummy text ever since the 1500s, when an unknown printer took a galley of typeand scrambled it to make a type specimen book. 

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been theindustry's standard dummy text ever since the 1500s, when an unknown printer took a galley of typeand scrambled it to make a type specimen book. 

Voici l'expression rationnelle que j'utilise pour trouver.

@@([\n\r\s]*)(.*)([\n\r\s]+)\^ 

mais cela ne rattrape ^0001 et ^0003 que ceux-ci ont un seul paragraphe, mais dans mon texte il y a des contenus multi para.

J'utilise le code VS, quelqu'un peut-il s'il vous plaît laissez-moi savoir comment puis-je capturer ces multi-chaînes en utilisant REGEX dans le code VS ou NPP.

Merci

+0

\ s est habituellement un espace, j'essayerais de supprimer cela ou d'ajouter un * pour indiquer zéro ou plus –

+0

Quelles sont les correspondances attendues et pourquoi? @Calvin, dans VSCode, '\ s' ne correspond pas aux nouvelles lignes. Comment pouvez-vous définir la limite de fuite? Est-ce que '@@' est toujours au début de la ligne? –

+0

@ WiktorStribiżew il correspond directement lorsque vous utilisez '@@' – user3872094

Répondre

1

Une chose étrange à propos de VSCode regex est que \s ne correspond pas à tous les caractères de saut de ligne. Il faut utiliser [\s\r] pour tous les faire correspondre. En gardant cela à l'esprit, vous voulez faire correspondre toutes les sous-chaînes commençant par @@, puis s'étendre jusqu'à ^ au début d'une ligne ou d'une fin de chaîne.

Je propose:

@@.*(?:[\n\r]+(?!\s*\^).*)* 

Voir la regex demo

NOTE: Pour ne correspondre @@ au début d'une ligne, ajoutez ^ au début du motif, ^@@.*(?:[\s\r]+(?!\s*\^).*)*.

Détails

  • ^ - début d'une ligne
  • @@ - un littéral @@
  • .* - le reste de la ligne (0+ caractères autres que les caractères de saut de ligne)
  • (?:[\n\r]?(?!\s*\^).*)* - 0 ou plusieurs occurrences consécutives de:
    • [\n\r]+(?!\s*\^) - un ou plusieurs sauts de ligne non suivi avec 0+ espaces et puis ^ omble
    • .* - le reste de la ligne

Dans Notepad ++, utilisez ^@@.*(?:\R(?!\h*\^).*)*\R correspond à une saut de ligne, et \h* correspond à 0 ou plusieurs espaces blancs (supprimez si ^ est toujours le premier caractère sur une ligne de délimitation).

+0

l'a fait dans NPP et il fonctionne comme prévu – user3872094

+1

@ user3872094: Dans Notepad ++, utilisez '^ @@. * (?: \ R (?! \ H * \ ^). *) *'. –

+0

J'ai essayé certaines combinaisons et j'ai réussi ça;) – user3872094

0

Je l'ai branché vos données d'entrée dans/tmp/test et obtenu les éléments suivants pour travailler en utilisant la syntaxe perl

grep -Pzo "@@(?:\s*\n)+((?:.*\s*\n)+)(?:\^.*)*\n+" /tmp/test 

Cela devrait être placer la Paragraph ne commençant pas par^dans 1 $. Il se peut que vous deviez ajouter \ r de nouveau dans ceci pour le faire correspondre parfaitement

+0

il suffit d'utiliser les bits à l'intérieur des guillemets dans votre code. –