我正在使用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
几乎完美......除了第一个方括号,就在开头。我敢肯定它可能很简单,但我觉得我太靠近树林看树了......我正绕着圈子试图瞄准那个支架而不撤消其他一切。有人能用正确的方式指出我吗?
答案 0 :(得分:5)
我会捕捉所有匹配而不是匹配你不想要的所有东西并剥离它。类似的东西:
\[\K[^\]]+
和小组\0
应该有您的结果。
它会发现[
然后忽略匹配,因为\K
然后捕获每个字符,直到]
。
演示:https://regex101.com/r/1GDA9t/1/
PHP实现将是:
preg_match_all('/\[\K[^\]]+/', $string, $matches);
print_r($matches);
答案 1 :(得分:1)
这个怎么样?:
^>\s\[([^\]]+)\]
你应该捕获第1组。它更简单,它可以完成工作。
答案 2 :(得分:1)
为什么不简单地为数字块钓鱼:
答案 3 :(得分:1)
看起来你只想要括号之间的所有东西,所以这将有效:
(?<=\[).+(?=])
小提琴:https://regex101.com/r/pRJNPG/2
(?<=\[)
是[
字符的后视。
.+
匹配任何字符一次或多次,直到前瞻。
(?=])
是]
字符的前瞻。
答案 4 :(得分:1)