2012-11-26 2 views
0

Comment puis-je faire correspondre un motif dans une chaîne comportant des sauts de ligne? par exemple.JAVA Correspondance de motif la plus longue dans une chaîne avec des sauts de ligne

requisition({"title":"my json", 
      "items" : [{ "A": "a", 
          "B": "b"} 
         ] 
      }) 

Je veux prendre ce que

{"title":"my json", 
      "items" : [{ "A": "a", 
          "B": "b"} 
         ] 
} 

J'ai essayé quelque chose comme

String pattern = ".*(\\{.*\\}).*"; 
Pattern r = Pattern.compile(pattern, Pattern.DOTALL); 

Mais sucess. Des sugestions?

Juste pour rendre plus clair. Ceci est mon input

+0

"Pas de succès". Est-ce qu'il échoue? Avez-vous un mauvais match? Laquelle? Ai-je raison de supposer que vous capturez tout à partir de '" A "...'? –

+0

@Reimeus, c'est une implémentation de l'analyseur JSON ce que j'essaie de faire – Medeiros

+0

Vous avez toujours une entrée dans ce format? Je veux dire, c'est toujours un appel de fonction avec un objet JSON en paramètre? Dans ce cas, ne pouvez-vous pas utiliser la sous-chaîne? –

Répondre

1

Le problème avec un seul objet JSON comme entrée est simple: votre premier .* est gourmand. Donc, il consomme tout jusqu'à la dernière { qui est toujours suivie par un }. Si vous avez fait que .* ungreedy (ou gauche dehors), vous devriez obtenir le plein objet JSON:

String pattern = ".*?(\\{.*\\}).*"; 

Mais vous pouvez (et devez) laisser les début et répétitions arrière complètement:

String pattern = "\\{.*\\}"; 

Ensuite, vous n'avez même pas besoin de capturer quoi que ce soit. Notez que ceci doit être utilisé avec find au lieu de matches. Cependant, votre entrée contient plusieurs objets JSON. Et c'est là que vous avez des problèmes avec les expressions régulières. Certains moteurs prennent en charge des constructions qui permettent une imbrication correcte des parenthèses (pour vérifier celles qui appartiennent réellement ensemble). Mais ces expressions régulières peuvent facilement devenir laides et ne pas être maintenables.

Vous êtes mieux, la marche de la chaîne manuellement, et en comptant le nombre de niveau d'imbrication actuel. Chaque fois que vous revenez au niveau supérieur, vous venez de couper une sous-chaîne (de la parenthèse d'ouverture correspondante à votre position actuelle).

+0

Merci. Je suis habitué à programmer en Python et j'aime le pouvoir RE pour résoudre les problèmes mais dans ce problème particulier je pense que les meilleures solutions sont quelque chose comme 'String sub = s.substring (s.indexOf (" {"), s.lastIndexOf ("}") + 1); ' – Medeiros

+0

@Medeiros oui, pour un seul objet JSON, c'est probablement la meilleure (et la plus lisible) solution. Cependant, il ne résoudra toujours pas votre problème pour un fichier contenant une liste d'objets JSON. –

Questions connexes