正则表达式正确匹配文件

时间:2017-10-26 16:07:20

标签: regex

我正在使用RegEx从文本文件中提取时间标记,如下所示:

> [00:00:00.1]  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
> [00:00:02.3]  Sed facilisis orci at erat vulputate facilisis.
> [00:00:08.2]  Nam aliquam velit quis nisl posuere, ut blandit turpis
> blandit. 
> [00:00:13.8]  Nulla sit amet metus felis. Nulla aliquam
> ultrices ipsum eget mattis. 
> [00:00:19.2]  Nulla porta ligula
> scelerisque lorem dapibus porttitor. 
> [00:00:26.6]  Praesent dolor mi,
> dictum et ante sed, efficitur auctor tortor. 
> [00:00:35.5]  Praesent
> euismod dui sem, 
>               vitae pretium nisi suscipit quis. 
> [00:00:39.7]  Nulla porta ligula scelerisque lorem dapibus porttitor.

期望的结果是:

00:00:00.1
00:00:02.3
00:00:08.2
00:00:13.8
00:00:19.2
00:00:26.6
00:00:35.5
00:00:39.7

经过大量的血,汗和泪,我得到了这个正则表达式......

(?:^|])([^[\]]+)(?:\[|$)

...产生这个结果:

[00:00:00.1
00:00:02.3
00:00:08.2
00:00:13.8
00:00:19.2
00:00:26.6
00:00:35.5
00:00:39.7

几乎完美......除了第一个方括号,就在开头。我敢肯定它可能很简单,但我觉得我太靠近树林看树了......我正绕着圈子试图瞄准那个支架而不撤消其他一切。有人能用正确的方式指出我吗?

5 个答案:

答案 0 :(得分:5)

我会捕捉所有匹配而不是匹配你不想要的所有东西并剥离它。类似的东西:

\[\K[^\]]+

和小组\0应该有您的结果。

它会发现[然后忽略匹配,因为\K然后捕获每个字符,直到]

演示:https://regex101.com/r/1GDA9t/1/

PHP实现将是:

preg_match_all('/\[\K[^\]]+/', $string, $matches);
print_r($matches);

演示:https://3v4l.org/EFnGc

答案 1 :(得分:1)

这个怎么样?:

^>\s\[([^\]]+)\]

你应该捕获第1组。它更简单,它可以完成工作。

答案 2 :(得分:1)

为什么不简单地为数字块钓鱼:

\d\d:\d\d:\d\d\.\d

答案 3 :(得分:1)

看起来你只想要括号之间的所有东西,所以这将有效:

(?<=\[).+(?=])

小提琴:https://regex101.com/r/pRJNPG/2

(?<=\[)[字符的后视。

.+匹配任何字符一次或多次,直到前瞻。

(?=])]字符的前瞻。

答案 4 :(得分:1)

我会简单地使用这个:

\[(.+)\]

并将捕获组1.
这是工作demo