Je ne sais pas si c'est ce que vous souhaitez obtenir. Cependant, la raison en est que vous pouvez vouloir envelopper votre chaîne avec des groupes de capture pour qu'elle soit simple à obtenir. Par exemple, cette expression exemples de la façon dont les groupes de capture fonctionnent autour des caractères souhaités :
^([0-9]+\n|)([0-9:,->\s]+)
Ce n'est peut-être pas la meilleure façon de le faire, ni la meilleure expression. Cependant, cela peut vous donner une idée pour aborder le problème différemment.
Je suppose que vous souhaitez capturer la ligne de la date et les lignes qui la précèdent, qui peuvent ou non contenir un nombre.
Graphique
Ce graphique montre comment l'expression fonctionnerait et vous pouvez visualiser d'autres expressions de cette manière. enlace :
Vous pourriez vouloir écrire un script pour nettoyer vos données, avant de les envoyer au moteur RegEx, afin d'obtenir une expression simple.
Exemple de test avec JavaScript
const regex = /^([0-9]+\n|)([0-9:,->\s]+)/mg;
const str = `1
00:00:04,019 --> 00:00:07,299
line1
line2
2
00:00:07,414 --> 00:00:09,155
line1
00:00:09,276 --> 00:00:11,429
line1
00:00:11,549 --> 00:00:14,874
line1
line2
`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Test PHP
Il se peut que vous n'obteniez pas le résultat souhaité, il s'agit simplement d'un exemple :
$re = '/^([0-9]+\n|)([0-9:,->\s]+)/m';
$str = '1
00:00:04,019 --> 00:00:07,299
line1
line2
2
00:00:07,414 --> 00:00:09,155
line1
00:00:09,276 --> 00:00:11,429
line1
00:00:11,549 --> 00:00:14,874
line1
line2
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
foreach ($matches[0] as $key => $value) {
if ($value == "") {
unset($matches[0][$key]);
} else {
$matches[0][$key] = trim($value);
}
}
var_dump($matches[0]);
Test de performance
Cet extrait de JavaScript montre les performances de cette expression en utilisant un simple 1 million de fois. for
boucle.
repeat = 1000000;
start = Date.now();
for (var i = repeat; i >= 0; i--) {
var string = '2 \n00:00:07,414 --> 00:00:09,155';
var regex = /(.*)([0-9:,->\s]+)/gm;
var match = string.replace(regex, "$2");
}
end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ");
Si vous souhaitez capturer tous les résultats souhaités dans une seule variable, vous pouvez simplement ajouter un groupe de capture autour de l'expression entière et l'appeler en utilisant $1
.
Vous pouvez également ajouter ou réduire des limites, si vous le souhaitez, telles que éste .
^(?:[0-9]+\n|\n)(([0-9:,]+)([\s->]+)([0-9:,]+))$
Exemple Test avec JavaScript pour la deuxième expression
const regex = /^(?:[0-9]+\n|\n)(([0-9:,]+)([\s->]+)([0-9:,]+))$/gm;
const str = `1
00:00:04,019 --> 00:00:07,299
- cdcdc
- cddcd
2
00:00:07,414 --> 00:00:09,155
54564
00:00:09,276 --> 00:00:11,429
- 445454 - ccd
- cdscdcdcd
00:00:11,549 --> 00:00:14,874
line1
line2
`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}