[PHP] pourquoi ma regex ne marche pas ?

pourquoi ma regex ne marche pas ? [PHP] - PHP - Programmation

Marsh Posté le 13-02-2017 à 19:12:29    

Bonjour  :bounce:  
 
J'ai un texte :
 

Citation :

"\nDeutsche Internationale Schule in Abu Dhabi\nP.O. Box 4150\nAbu Dhabi\nTelefon:\t00971-2-6668668\nTelefax:\t+ 971-2-6653107\nE-Mail-Schule:\tinfo@gisad.ae\nE-Mail VwLtr:\tdoris.boehm@gisad.ae\nE-Mail Vorstand:vv@gisad.ae\n\nInternet:\twww.gisad.ae\n\nZeitdifferenz (in Std.):\nSommerzeit:\t+2\nWinterzeit:\t+3\n\n2. Zuständige Auslandsvertretung:\nEmbassy of the Federal Republic of Germany\nP.O.Box 2591\n\n\n\nAbu Dhabi\n\n\n\nVereinigte


 
Je veux le matcher et sélectionner "Deutsche Internationale Schule in Abu Dhabi", entre les deux premiers retours chariots ("\r" ).
 
voilà ma redex :

Code :
  1. ^[^\n]*\n([^\n]+).*


 
pourquoi ça ne marche pas ? regex101.com me dit que c'est parce que "[^\n]*" matche déjà tout mon texte... Je ne comprends pas parce qu'il devrait s'arrêter au premier "\n"  :??:  
 
 
Merci !

Reply

Marsh Posté le 13-02-2017 à 19:12:29   

Reply

Marsh Posté le 13-02-2017 à 21:16:39    

Il a pourtant l'air de marcher ton truc... https://regex101.com/r/vzVKJg/1 Il faut bien sur penser à remplacer les \n par des vrais sauts de ligne.
 
Le .* m'a l'air d'être inutile (sauf contraintes particulières au PHP que je ne connais pas).

Reply

Marsh Posté le 13-02-2017 à 22:33:23    

Tu es sûr du format de tes retours lignes ? Et ce sont VRAIMENT des retours lignes et pas des caractères échappés comme dans ton exemple ?
Un truc plus cross platform pour les retours c'est : \r\n?|\n


Message édité par TotalRecall le 13-02-2017 à 22:33:56

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 14-02-2017 à 08:38:06    

Comme le dit TotalRecall, si tu veux matcher ton texte avant que les caractère ne soient échapés (donc en brut comme tu l'as mis dans ton post), ton '\n' sera matché par '\\n'. Attention, il s'agit de deux caractère donc ça ne marchera pas si tu le met entre []


---------------
sheep++
Reply

Marsh Posté le 14-02-2017 à 11:03:06    

Très bonnes :o remarques de TotalRecall et h3bus. :jap:  
 
Si c'est le cas je propose ^.*?\\n(.*?)\\n
 
https://regex101.com/r/667OFv/1
 
Le truc utile et utilisé ici c'est le "lazy quantifier" (que je connais sous le nom "non-greedy" ): *? Matches as few characters as possible.


Message édité par rat de combat le 14-02-2017 à 11:37:55
Reply

Marsh Posté le 15-02-2017 à 18:46:15    

Merci beaucoup pour les réponses !
 
D'abord je précise que j'ai mis "php" parce que c'est un langage répandu et que ça revient au même pour mon problème mais qu'en fait j'utilise R...
 
Vous avez raison ce ne sont pas des retours chariots dans mon texte mais juste un "\" et un "n" qui se suivent. (J'ai fait pas mal de manip pour avoir un objet manipulable dans R : pdf→txt→list→vecteur... comme je débute je tâtonne pas mal, et je me perds parfois)
 
Je ne connaissais pas le "lazy quantifier", il a l'air utile... ta proposition me semble très bien, ça marche sur le testeur, mais pour une raison que j'ignore sous R la parenthèse prend le tout texte sauf les deux premiers "\n", ceux qui encadrent ce que je veux  :fou:  
 
J'ai aussi essayé ^[^\\]*\\n([^\\]+).*, qui marche sur regex101 mais pas avec R, qui me renvoie une erreur  :fou:

Citation :

 Erreur de compilation du motif PCRE
 'missing terminating ] for character class'
 at ''


 
Bon, d'abord il y a un problème spécifique à R : l'antislashs. R interprête \\ comme \... et \\\\ comme \\. Donc j'essaye en remplaçant les \\ par des \\\\, y'a du mieux mais c'est pas encore ça...


Message édité par Jean Betterave le 15-02-2017 à 22:01:09
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed