[ASP.Net] .Net, Fichiers et RegExp

.Net, Fichiers et RegExp [ASP.Net] - C#/.NET managed - Programmation

Marsh Posté le 19-12-2006 à 10:59:04    

Bonjour,
 
J'ai un souci de regexp en fait. De remplacement.
 
Ce que je fais c'est que j'ouvre un fichier html contenant des liens de la forme :  
 
file:///C:\Documents and Settings\...\...\...\Links\nomfichier.ext
 
Et moi, je voudrais remplacer ça par :
 
./Links/nomfichier.ext
 
Donc j'ai pensé aux regexp...
 
Voici mon code :  
 
(Mon pattern de regexp semble être valide)
 

Code :
  1. Dim CheminBis As String = Server.MapPath("output/" & PureFileName & "_sortie.html" )
  2.             Dim fs As New System.IO.FileStream(CheminHTM, IO.FileMode.Open, IO.FileAccess.Read)
  3.             Dim fwrite As New System.IO.FileStream(CheminBis, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
  4.             Dim sR As New System.IO.StreamReader(fs)
  5.             Dim sM As String = sR.ReadLine
  6.             Dim sw As New System.IO.StreamWriter(fwrite)
  7.             Dim i As Integer = 0
  8.             Dim ChrTmp As String = Nothing
  9.             'Lecture des lignes du fichier
  10.             Do Until sM = ""
  11.                 For i = 1 To Len(sM)
  12.                     If Asc(Mid(sM, i, 1)) = 63 Then
  13.                         'Récupération du caractère "saut de paragraphe" généré par InDesign
  14.                         ChrTmp = Mid(sM, i, 1)
  15.                     End If
  16.                 Next
  17.                 'Remplacement du caractère "saut de paragraphe"
  18.                 sM = Replace(sM, ChrTmp, "<br />" )
  19.                 'Remplacement des liens absolus par des liens relatifs
  20.                 Dim ereg_ChWin As New Regex("file:\/\/\/[a-zA-Z]:\/(.+\/)+Links\/" )
  21.                 Dim ereg_ChWin2 As New Regex("file:\/\/\/[a-zA-Z]:\\(.+\\)+Links\\", RegexOptions.Singleline)
  22.                 Dim ereg_ChWin3 As New Regex("[a-zA-Z]:\/(.+\/)+Links\/" )
  23.                 Dim ereg_ChWin4 As New Regex("[a-zA-Z]:\\(.+\\)+Links\\" )
  24.                 Dim ereg_ChNet As New Regex("\\\\(.+\\)+Links\\" )
  25.                 'ereg_ChWin.Replace(sM, "./Links/" ) Mis en commentaire pour l'instant
  26.                 ereg_ChWin2.Replace(sM, ".\Links\" )
  27.                 'ereg_ChWin3.Replace(sM, "./Links/" ) Mis en commentaire pour l'instant
  28.                 'ereg_ChWin4.Replace(sM, ".\Links\" ) Mis en commentaire pour l'instant
  29.                 'ereg_ChNet.Replace(sM, ".\Links\" ) Mis en commentaire pour l'instant
  30.                 'sM = Replace(sM, "file:///@#FILELINK#@", "." ) Ancien remplacement "à la main"
  31.                 'Ecriture dans le fichier de sortie
  32.                 sw.WriteLine(sM)
  33.                 'Lecture ligne suivante
  34.                 sM = sR.ReadLine()
  35.             Loop
  36.             sw.Close()
  37.             sR.Close()


 
Du coup rien n'est trouvé, et le remplacement ne se fait pas...
 
J'aimerais bien savoir ce qui cloche, mais là je vois pas....


Message édité par backdafuckup le 19-12-2006 à 11:00:58
Reply

Marsh Posté le 19-12-2006 à 10:59:04   

Reply

Marsh Posté le 19-12-2006 à 13:32:35    

allez regrimpe petit topic :bounce:


Message édité par backdafuckup le 19-12-2006 à 13:32:49
Reply

Marsh Posté le 19-12-2006 à 13:34:21    

Comment on détermine quel est le "répertoire courant" (pour construire un chemin relatif au lieu de l'absolu)?

 

Et accessoirement, il serait possible que tu postes un petit batch des liens que tu as actuellement (histoire d'avoir un sample des trucs que tu veux, parce que la dernière fois que moinmoin a demandé une regex on a mis 3h a lui extraire les vraies spécs du nez)

 

Et accessoirement tu pourrais m'expliquer pourquoi tu préfixes tes noms de patterns avec "ereg" alors que

  • Ca n'a de sens qu'en PHP (et encore)
  • Il me semble que les Regex .Net sont des PCRE, donc correspondant au "package" php `preg` et non à `ereg`


Message édité par masklinn le 19-12-2006 à 13:40:14

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-12-2006 à 14:53:42    

Voilà des exemples de liens que j'ai dans le fichier
 
file:///C:/Documents%20and%20Settings/lenomdemoncompte/Bureau/Training%20Manual/v2/Dossier%20ATC%20TM%20Final%20A4/Links/P07-08%20PROCEDURES%20INITIALIZATION.doc
 
C:\Documents and Settings\lenomdemoncompte\Bureau\Training Manual\v2\Dossier ATC TM Final A4\Links\photo ATR 72-500modifie.jpg
 
C:\Documents and Settings\lenomdemoncompte\Bureau\Training Manual\v2\Dossier ATC TM Final A4\Links\FOND~sep~COU.jpg
 
Et voici ce que j'aimerais à la place
 
./Links/photo ATR 72-500modifie.jpg
./Links/FOND~sep~COU.jpg
 
etc etc...
 
J'ai bon là ?
 
Et le "ereg" c'est juste des noms de variable en fait....
Ca ne symbolise rien du tout...
Je peux les appeler toto1 toto2 et toto3 si tu veux ^^
 
Merci d'avance ;)

Reply

Marsh Posté le 19-12-2006 à 15:07:21    

Donc faut juste transformer le chemin à partir de "links" [:petrus dei]

 

C'est pas plus compliqué que ça [:petrus dei]


Message édité par masklinn le 19-12-2006 à 15:08:13

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-12-2006 à 15:18:11    

Ben oui c'est juste ça !!
 
T'as vu mes patterns ? Ils sont pas bons ?

Reply

Marsh Posté le 19-12-2006 à 15:26:52    

Ils sont surtout ultra compliqués pour ce que tu veux faire.
 
J'ai jamais fait de VB, mais normalement ce dont tu as besoin devrait ressembler à ça:

Code :
  1. Dim pattern  As Regex = New Regex(".+\\([^\\]+)\\([^\\]+)$" )
  2. output = pattern.replace(input, "./$1/$2" )


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-12-2006 à 15:34:20    

En fait voilà un exemple de ligne de mon fichier :  
 
 

<div><img src="file:///C:\Documents and Settings\moncompte\Bureau\Training Manual\v2\Dossier ATC TM Final A4\Links\photo ATR 72-500modifie.jpg" width=


 
Et je veux :  
 

<div><img src=".\Links\photo ATR 72-500modifie.jpg" width=


 
Ca va toujours dans ton sens ? Parce que si je comprends bien ta regexp, je suis pas sur du résultat :(

Message cité 1 fois
Message édité par backdafuckup le 19-12-2006 à 15:34:57
Reply

Marsh Posté le 19-12-2006 à 15:37:38    

Ah ben je viens de tester avec une petite appli de test de regex, et ça donne le bon résultat...
 
T'es trop fort....
 
Par contre, je comprends rien à ta regexp....

Reply

Marsh Posté le 19-12-2006 à 15:42:40    

Alors ça remplace, mais ça me bousille de l'html avec, donc doit y avoir un souci...
 
j'ai fait ça :  

Code :
  1. Dim ereg_ChWin As New Regex(".+\\([^\\]+)\\([^\\]+)$" )
  2. sM = ereg_ChWin.Replace(sM, "./$1/$2" )


 
Et ça me bousille tout..

Reply

Marsh Posté le 19-12-2006 à 15:42:40   

Reply

Marsh Posté le 19-12-2006 à 15:55:17    

backdafuckup a écrit :

En fait voilà un exemple de ligne de mon fichier :

 


<div><img src="file:///C:\Documents and Settings\moncompte\Bureau\Training Manual\v2\Dossier ATC TM Final A4\Links\photo ATR 72-500modifie.jpg" width=

 

Et je veux :

 

<div><img src=".\Links\photo ATR 72-500modifie.jpg" width=

 

Ca va toujours dans ton sens ? Parce que si je comprends bien ta regexp, je suis pas sur du résultat :(


Tu transformes la re en:

Code :
  1. r'src="[^"]+\\([^\\"]+)\\([^\\"]+)"'


le remplacement ne change pas
Par contre fait gaffe à l'échappement des ", là c'est un string python donc pas besoin de les échapper, en VB je sais pas

backdafuckup a écrit :

Ah ben je viens de tester avec une petite appli de test de regex, et ça donne le bon résultat...

 

T'es trop fort....

 

Par contre, je comprends rien à ta regexp....


Je vais expliquer la première (ce qui se trouve du # à la fin de la ligne, sur chaque ligne, est un commentaire)

.+ # Prendre n'importe quel caractère de multiples fois
\\ # Dans la mesure où "\" est un metacaractère dans les REs, "\\" permet de matcher un "\"
( # Ouvre un "groupe de match" (pour pouvoir récupérer le contenu dans $1 - $99)
[^\\]+ # Matche n'importe quelle suite de caractères *sauf* "\", donc ça ne matche que le nom d'un répertoire/fichier entre deux séparateurs
) # ferme le groupe de match
\\
([^\\]+)
$ # Matche une fin de chaîne, très bien pour matcher juste sur une string, par contre ne matche pas pour ton cas d'utilisation réel (enfin si mais ça fait des conneries quoi)


Après en terme d'efficacité, cette regex n'est pas terrible parce qu'elle backtrack beaucoup, mais bon c'est pas super grave.


Message édité par masklinn le 19-12-2006 à 15:56:59

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-12-2006 à 16:58:22    

T'es un boss, franchement merci...
 
Ca marche niquel...
 
A+

Reply

Marsh Posté le 19-12-2006 à 22:05:35    

du VB [:hahaguy]


Message édité par Tamahome le 19-12-2006 à 22:05:44
Reply

Sujets relatifs:

Leave a Replay

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