2
votes

RegEx pour analyser les lignes entre deux chaînes dans scala

J'ai un fichier texte de forme libre (non XML) à partir duquel je voudrais analyser les lignes entre deux modèles. Voici les exemples de données

val pattern = "^<Hi>(.*)\\n"
val pattern = "^<Hi>(.*)\\s*$"
val pattern = "^<Hi>(.*)"
val pattern = "^<Network>(.*)((\\r\\n|\\n|\\r)$)|(^(\\r\\n|\\n|\\r))|^\\s*$"

Je souhaite analyser les données entre chaque balise, c'est-à-dire et la ligne vide en une seule chaîne. De même, les données entre et la ligne vide comme une autre chaîne.

Le modèle regex que j'ai essayé jusqu'à présent n'a pas fonctionné. P >

<Hi>
col1 col2 col3
1 2 3 
4 5 6
helo how are 

<How>
col1 col2
1 2 
helo hi'

Est-il possible de spécifier un modèle pour la ligne vide. Toute aide est appréciée.


4 commentaires

C'est un texte de forme libre. Pas un XML


Je l'ai mentionné. Merci.


Essayez de rechercher le modificateur "DOTALL" pour les expressions régulières. Essayez-le et si vous êtes bloqué, mettez à jour la question. Vous pouvez également publier le code que vous utilisez pour exécuter l'expression régulière et imprimer les résultats.


Vous pouvez essayer quelque chose comme ceci ([\ s \ S] +) (? = ^ $) Démo


3 Réponses :


5
votes

Vous pouvez utiliser cette expression régulière et capturer vos données du groupe1,

<[^>]+>\s*([\w\W]*?(?=\n\n|$))

Démo Regex

  • ] +> \ s * - Commencez à capturer la balise à l'aide de edral+> et d'espaces blancs facultatifs avec \ s *
  • ([\ w \ W] *? - Capturez tous les caractères, y compris les retours à la ligne, de manière non gourmande
  • (? = \ n \ n | $)) - Regard positif pour s'assurer que la correspondance s'arrête dès qu'elle voit deux nouvelles lignes ou une fin absolue de chaîne


0 commentaires

4
votes

Utilisez plutôt ceci: [^ \>] + (? = \ n {2,} | $ | \ <) . N'oubliez pas d'utiliser l'indicateur global pour trouver toutes les correspondances. Vous pouvez consulter l'explication ici:

https://regexr.com/4e9c1


0 commentaires

3
votes

Solution dans le code.

val src = io.Source.fromFile("so.txt")

"(?s)>\\s*(.+?)(?=\n\n|$)".r
                          .findAllMatchIn(src.mkString)
                          .map(_.group(1))
                          .mkString("->", "<-\n->", "<-")
//res0: String =
//->col1 col2 col3
//1 2 3
//4 5 6
//helo how are <-
//->col1 col2
//1 2
//helo hi'<-

src.close()


0 commentaires