L'API d'analyseur (que je n'ai pas autorisé à modifier) me donne une chaîne de ce formulaire: Je veux diviser cette chaîne à l'aide de regex telle que: p> xxx pré> Fondamentalement première variable est le premier mot non espace après 1 ou plusieurs espaces et fin lorsque l'espace est rencontré. p> seconde variable commence à partir du premier caractère sans espace après la première variable jusqu'à la fin de la ligne. Si le dernier caractère est "\", ajoutez la ligne suivante à la deuxième variable (ne coupe pas l'espace blanc entre le dernier caractère sur la ligne Cur et "\"). "\" ne doit pas capturer la ligne suivante, mais renvoie "\" (aucune évasion). Seulement couper l'espace blanc pour la dernière ligne. P> Troisiable La troisième variable est tout après la deuxième variable. P> jusqu'à présent, j'ai pu proposer cette regex qui ne fonctionne que avec une ligne pour VAR2 et VAR3 P> $my_re = qr/\s+(\S+)\s+(\S+)\s+[\n](.*)/
$text =~ /$my_re/
3 Réponses :
premier mot, puis tout à la hauteur d'une nouvelle ligne immédiatement précédée d'une non-barrance; alors tout le reste le modificateur Exemple programme P> / s code> le rend afin que le
. code> correspond également à la nouvelle ligne, critique ici (normalement ça ne fait pas " t). Le modificateur
/ x code> Ignore les espaces littéraux afin que nous puissions le rendre plus lisible. P>
"var1"
---
"var2 \
var2continued var2continued \\
var2continued"
---
"var3
var3continued \
var3continued"
Votre barre oblique inverse évacue la prochaine barre oblique inverse. Le \\\ est en fait \\ quand imprimé. Ma chaîne est en fait après avoir échappé. De plus, j'ai besoin de supprimer une barre oblique inverse en cas d'impair pour 2 $. Je crois de googler que vous ne pouvez pas sauter des personnages dans des groupes capturés. Donc, j'ai dû boucler à travers chaque ligne.
@Topa " Backslash échappe à la prochaine backslash i>" - hum? Voulez-vous dire le [^ \\] code> ...? Oui, il l'échappait à ce que nous obtenons une classe de caractères "non-backslash". Vous ne pouvez pas simplement placer une glash en arrière dans une classe de caractères (comme
[\] code>) car il échapperait au
] code>, ce qui en fait une erreur de syntaxe (car alors le Ouverture
[ code> ne serait pas fermé)
@Topa " Ma chaîne est réellement après avoir échappé. I>" - heh ... Votre chaîne est exactement i> Ce que vous avez montré dans la question. Les personnes qui achètent une question ne peuvent pas deviner ce que vous voulez dire, et que " après avoir échappé à i>" chose n'est pas mentionné sur lui question (et je ne sais pas vraiment ce que vous entendez par ça?)
@Topa " J'ai aussi besoin de supprimer une barre oblique inverse si elle ... i>" - encore une fois, vous ne le mentionnez jamais dans la question. (La sortie que vous affichez a en effet deux backslashes et ma réponse reproduit cela.)
@Topa " ne peut pas sauter des caractères dans des groupes capturés i>" --- Je ne comprends pas ce que vous entendez par là. La regex dans la réponse fonctionne (et implémente votre description)
Ouais mon mal. Ma question n'est pas si claire sur la plupart des cas et est laissée ouverte pour beaucoup d'interprétation (je suis également venu avec plus de règles après avoir écrit la question). Mais toujours, la chaîne d'origine de ma question avait une barre oblique inverse qui a été retirée en première ligne.
@Topa " avait une barre oblique inverse qui a été supprimée i>" - ah, oui, je vois que - celui sur la ligne avec $ var2 code>. Donc, sur quel compte devrait-il être supprimé: s'il y a un nombre impair d'attelle, tombez-en une?
Essayez de suivre un code de code suivant (ma prise au problème) sortie p>
Il ne supprime pas une barre oblique inverse pour un nombre impair de backslashes. Je crois que c'est undotable dans une regex.
Aucune des réponses n'a travaillé pour tous les cas (2 et 3 sont facultatives). J'ai eu un petit problème dans lequel l'analyseur ajoutait de l'espace après la barre oblique inverse.
J'ai fini par diviser le texte dans une matrice de lignes. Ensuite, divisez-la en deux parties (1 et 2 ensemble et 3 par elle-même). Ensuite, je lui ai fragé la première partie par elle-même. Mon code actuel est divisé en plusieurs fonctions mais j'ai simplifié ci-dessous: P>
my $empty_re = qr/^\s*$/; my $def_re = qr/(.*?)((?:\\{2})*)(\\?)\s*$/; my $dual_token_re = qr/\s*(\S+)\s*(.*)/s; $text= "place text here" my @lines = split /\n/, $text; my $i; my $j; my $def = ""; my $other; # Get start capture for($i=0;$i<=$#lines;$i++){ last if !($lines[$i] =~ /$empty_re/); } # Start definition capture for($j=$i;$j<=$#lines;$j++) { $lines[$j] =~ s/$def_re/$1$2/; # remove ending backquote if odd last if !$3; # break if even backquotes } $def = join "\n", @lines[$i..$j]; $j++; # Get remaining text if ($j <= $#lines) { $other = join "\n", (splice @lines, $j); } # $def has 1 and 2, $other has 3 $def =~ /$dual_token/ # now $1 and $2 has 1 and 2, $other has 3
" ... des cas (2 et 3 sont facultatifs) i>" --- mais la question ne donne même pas de soupçon de cela? Au contraire, cela fait spécifiquement des déclarations sur les groupes 2 et 3.
Compte tenu des commentaires sous réponses, la description de la question omet des faits importants. (Il est également un peu difficile de suivre.) Je suggère d'être très prudent dans la formulation de questions, car ce texte est la seule chose que nous devons accueillir. Veuillez vous rappeler que les personnes qui lisent cela ont généralement absolument i> aucun indice sur votre problème.