Я не совсем уверен, если это то, что вы хотели бы захватить.Однако причина в том, что вы можете захотеть обернуть вашу строку группами захвата, чтобы их было легко получить.Например, это выражение показывает, как группы захвата работают вокруг желаемых символов:
^([0-9]+\n|)([0-9:,->\s]+)
Возможно, это неспособ сделать это, или лучшее выражение.Тем не менее, это может дать вам идею по-другому подойти к проблеме.
Я предполагаю, что вы, возможно, захотите захватить строку даты и времени перед ней, которая может иметь или не иметь номер.
График
Этот график показывает, как будет работать выражение, и вы можете визуализировать другие выражения в этой ссылке :
Возможно, вы захотите написать скрипт для очистки ваших данных перед отправкой в движок RegEx, чтобы у вас было простое выражение.
Пример теста с 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}`);
});
}
PHP Test
Это может не сгенерировать желаемый результат, это всего лишь пример:
$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]);
Performance Test
Этот фрагмент JavaScript показывает производительность этого выражения, используя простой цикл for
в миллион раз.
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. ? ");
Если вы хотите захватить все нужные выходные данные в одну переменную, вы можете просто добавить группу захвата вокруг всего выражения и затем вызвать ее, используя $1
.
Вы также можете добавить или уменьшить границы, если хотите, например, этот .
^(?:[0-9]+\n|\n)(([0-9:,]+)([\s->]+)([0-9:,]+))$
Пример теста с JavaScript для второго выражения
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}`);
});
}