7
votes

Comment puis-je réparer cette expression régulière multiligne dans Ruby?

J'ai une expression régulière dans Ruby qui ne fonctionne pas correctement en mode multiligne.

J'essaie de convertir le texte de marque dans le balisage textile-equen utilisé dans RedMine. Le problème est dans mon expression régulière pour la conversion de blocs de code. Il devrait trouver toutes les lignes menant à 4 espaces ou à un onglet, puis enveloppez-les dans les balises pré em>. P> xxx pré>

résultat prévu: p> xxx pré>

Le problème est que la balise de fermeture pré em> est imprimée à la fin du document au lieu de "FN ();". J'ai essayé des variations de l'expression suivante, mais cela ne correspond pas: P>

gsub!(/(^(?:\s{4}|\t).*?$)+^(\S)/m, "<pre>\n\\1\n</pre>\\2")


4 Réponses :


13
votes

Premièrement, notez que 'M' MODE MULTI-LIGNE dans RUBY est équivalent au 'S' Mode mono-ligne d'autres langues. En d'autres termes; 'M' en mode Ruby signifie: "DOT correspond à tous" .

Cette regex fera un très bon travail de correspondance d'une section de code de type marquée: xxx

Ceci nécessite une ligne vierge avant et après la section de code et permet des lignes vides dans la section de code elle-même. Il permet de \ r \ n ou \ n Terminations de ligne. Notez que cela ne dépasse pas les principaux espaces (ou l'onglet) avant chaque ligne. Cela nécessitera plus de complexité de code. (Je ne suis pas un gars rubis alors ne peut pas aider avec ça.)

Je recommanderais de regarder la source de marque elle-même pour voir comment sa réellement fait.


1 commentaires

Merci pour les commentaires détaillés ridghingunner. Je pense que le vôtre était la seule réponse jusqu'à présent qui a effectivement fonctionné pour mes spécifications hors de la boîte.



0
votes

1 commentaires

a vu la poste de Ridgerunner après avoir posté ceci, définitivement une meilleure réponse.



0
votes

ici '' '' '' '' '' '' '' '' '' 'est-il capture toutes les lignes en retrait dans un seul bloc Xxx


0 commentaires

0
votes

Ceci fonctionne pour moi avec votre exemple d'entrée.

markdownText.gsub(/\n?((\s{4}.+)+)/, "\n<pre>#{$1}\n</pre>")


0 commentaires