[RegExp]Besoin de votre aide

Salut à tous!
J’ai grand besoin d’aide de quelqu’un qui gère les RegExp pour un p’tit projet qui consisterait à décoder un fichier .srt dans Flash.

Voici la structure du fichier en question:

1
00:00:01,125 --> 00:00:03,500
Prout
Tagada tsoin-tsoin

2
00:00:05,000 --> 00:00:07,125
Pouet

Le but de la manoeuvre serait de pondre trois tableaux: un avec les timecodes d’entrée, un avec les timecodes de sortie et un dernier avec les textes, mais j’ai beau me creuser la tête, les regex, je ne m’en sors pas, c’est vraiment du chinois.

En français, j’arrivais à ça:

tableau1 = les 12 caractères qui précèdent " --> "
tableau2 = les 12 caractères suivent " --> "
tableau3 = les caractères (nombre indéfini) qui précèdent deux \n de suite et qui suivent le \n qui suit les 12 caractères qui suivent le " --> "

Je sais même pas si mon raisonnement est correct et je sais encore moins le traduire en charabia…

Quelqu’un peut m’aider?

Un très grand merci d’avance

comme ca sur le tas avec une bière je dirais :
(\d\d:\d\d:\d\d,\d+)\s?–>\s?(\d\d:\d\d:\d\d,\d+)\n(\S+)\n\n

avec tab1 = $1, tab2 = $2 et tab3 = $3.

Par contre, flemme de cherche mais je sais pas si les \n sont pris en compte par le \S+. à vérifier.

EDIT : ca marche pas y a des problèmes au niveau des \n. Je regarderai peut être plus tard si personne n’a pris le relais (et si j’ai le temps).
EDIT bis : le \S+ est incorrect puisqu’il ne permet pas les espaces.

ya une option qui permet de prendre tout le motif comme une seule ligne.
Même que ça doit être s.

J’ai pas regarde en detail (vacances a la plage aussi faut pas deconner :crying:) mais la methode pour faire des regex compliquees, c’est de les reduire a des machines a etats finies. Ca devient super plus facile a ecrire apres. Cherche “regular expression finite state machine” et tu devrais trouver ton de l’aide sur l’internet multimedia :).

A l’arrache (5 minutes chrono), en C# (y a bien qqu’un qui pourra traduire en flash au besoin)

(\d*?\r\n(?<tc_start>\d{2}:\d{2}:\d{2},\d{3})\s–>\s(?<tc_end>\d{2}:\d{2}:\d{2},\d{3})\r\n(?.*?)(\r\n\r\n|\r\n$))

Juste pour expliquer la logique (vu que je pars 15 jours aux US dans peu de temps et que je suis pas sur de repasser par le forum) :

[ul]
[li]Les parenthèses en début et fin, c’est pour s’assurer que toute la séquence est bien capturée[/li][li]C’est pas optimisé (on pourrait virer des captures mais bon)[/li][li]Je sais pas si Flash fait du Lazy capture (avec le ?). Si c’est pas le cas, have fun ^^[/li][li]le ou | à la fin, c’est pour gérer le cas éventuel ou le dernier enregistrement du fichier finit pas par 2 \r\n. Si c’est toujours le cas, on peut s’en passer.[/li][li]Le reste me semble assez limpide[/li][/ul]

[Edit] C’est dingue comme j’ai appris à aimer les expressions régulières quand même ^^.

Vi, là c’est limite indécent, même! :slight_smile:

Blague à part, un très grand merci à toi. Quand je vois le machin final, ça ne m’étonne pas que je n’en sortais pas, chais pas, je dois faire un blocage comme à l’époque des cours de math, les gros trucs incompréhensibles comme ça, j’arrive pas.

J’essaierai de mettre ça en place quand je serai de nouveau sur le PC sur lequel je bosse.

Un grand merci aussi aux autres pour leurs réponses et bon week end à tous!

Effectivement avec cette RegExp tu matches, en revanche tu matches aussi des données qui sont erronées. En gros tu matches la syntaxe mais pas l’intégrité des données.
Tu peux te retrouver avec des timecodes du style qui se verront matchés :
1
35:75:65,125 → 35:76:98,125
Prout
Tagada tsoin

Pour éviter cela faut du coup éviter \d mais découper avec des bornes [0-9], ce qui est je te l’accorde beaucoup plus relou…

[quote=“Dolu, post:7, topic: 47526”]Effectivement avec cette RegExp tu matches, en revanche tu matches aussi des données qui sont erronées. En gros tu matches la syntaxe mais pas l’intégrité des données.
Tu peux te retrouver avec des timecodes du style qui se verront matchés :
1
35:75:65,125 --> 35:76:98,125
Prout
Tagada tsoin

Pour éviter cela faut du coup éviter \d mais découper avec des bornes [0-9], ce qui est je te l’accorde beaucoup plus relou…[/quote]

Donc je reviens de vacances, ca fait plus de 24 heures que j’ai pas dormi, et je dois avoir les prémisses du décalage horaire qui se fait sentir, mais je comprend absolument pas ce que tu veux dire ^^ Ils sont érronés comment tes timecode ? Supérieurs à 60 ?

Yep tout a fait. T’es pas censé de retrouver avec 35:75:65,125 dans ton timecode mais plutôt 37:16:05,125.

Ben euh, si l’objectif de ce qui était demandé c’était de faire une recherche des BONS timecodes, je serais d’accord avec toi, mais ce que souhaitait faire Sined c’était récupérer TOUS les timecodes, qu’ils soient bon ou mauvais manifestement.

Je remonte un peu le topic parce que monsieur hésite à créer un nouveau topic dessus. Alors voilà, j’aimerais faire une expression régulière sur des montants formatés ou pas.

Exemple, je veux à la fois saisir “2 145 200,15” et “21450,15”. La dessus, je n’ai pas réellement de problème avec cette expression tant que j’empeche l’utilisateur d’utiliser les touches alphabétiques et autres caractères spéciaux :

[0-9]{1,3}.[0-9]{1,3}.[0-9]{0,3}(?:,\d{0,2})?$

Mais, voilà, dès que je teste un montant avec une précision supérieure à 2. Le controle RegularExpressionValidator ne me gueule pas dessus. Par contre, il commence à gueuler dès qu’il y a trop de chiffres. Je sais qu’utiliser “.” est pas bon du tout mais je n’ai pas pu faire mieux. ET le \s pour “espace” m’a semble t’il pas fonctionner dans le cas où la valeur est un millier. Je me suis aidé de quelques explications sur les RegExp dont celui ci que je le trouve super mais j’ai vraiment du mal pour ce cas ci.

Est-ce que tu peut être plus précis ? Qu’est ce qui marche (avec exemple), qu’est ce qui ne marche pas (avec exemple), qu’est ce que tu veux (avec exemple).

Disons que je veux interdire la saisie d’un montant comme celui ci “155,111” ou encore “2,4555” bref, un montant qui a une précision supérieur à 2. De même, j’aimerais que l’expression régulière puisse reconnaitre sans problème la saisie d’un montant sous ce formattage “1 234”, “1 234,12”, “125 200,00”, “1 254 210”, “125444,00” (sans espace) et ainsi de suite.

Je suis pas sur que ca soit faisable. J’aurais plutôt tendance à d’abord traiter la chaine pour supprimer tous les espaces superflus, puis a tester cette chaine contre une regex « simplifiée ». Je suis pas convaincu qu’il y ait des moyens simples de régler des problemes de saisi du type « 12 345 12 1 2574,2 5 » par exemple.