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> 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 :
Premièrement, notez que Cette regex fera un très bon travail de correspondance d'une section de code de type marquée: p> 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 Je recommanderais de regarder la source de marque elle-même pour voir comment sa réellement fait. P> P> 'M' code> MODE MULTI-LIGNE dans RUBY est équivalent au
'S' code> Mode mono-ligne d'autres langues. En d'autres termes;
'M' code> en mode Ruby signifie: "DOT correspond à tous" em>.
\ r \ n code> ou
\ n code> 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.) P>
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.
/ ^ (\ s {4} | \ t) +. + \; \ n $ / m p>
fonctionne un peu mieux, ramasse toujours une nouvelle ligne que nous ne voulons pas. ici c'est sur Rubular. P>
a vu la poste de Ridgerunner après avoir posté ceci, définitivement une meilleure réponse.
ici '' '' '' '' '' '' '' '' '' 'est-il capture toutes les lignes en retrait dans un seul bloc
Ceci fonctionne pour moi avec votre exemple d'entrée.
markdownText.gsub(/\n?((\s{4}.+)+)/, "\n<pre>#{$1}\n</pre>")
Pourquoi ne pas inclure nouvelle ligne dans votre regex:
((?: \ S {4} | \ t). *? \ N) + code>
Dupliqué possible de Match de regex Match étiquettes à l'exception des balises autonomes XHTML < / a>
@Mladen Jablanovic, je n'ai pas pu obtenir votre exemple pour travailler à l'aide de ce code:
met Markdowntext.gsub! (/ ((((((((((((\ S {4} | \ t). *? \ N) + /, " Pré> \ n \\ 1 \ n pré> ") code>. Comment
\ n code> se comporter différemment de
$ code>?
Ce n'était que la regex pour obtenir la partie en retrait (l'a essayée dans Rubular), pas une solution complète du travail GSUB (par conséquent, juste un commentaire).