~\[(.*)\] (.*): (.*)~s
所需的行为是在[
和]
之间捕获文本(两者的第一次出现)。所以在这种情况下:
[7/25/2015 8:40:18 PM] Ghost: [Saturday, July 25, 2015 8:13 PM] Nathan:
<<< Quoted text
应该捕获 7/25/2015 8:40:18 PM
。但是,正如您在regex101示例中所看到的,捕获的文本为7/25/2015 8:40:18 PM] Ghost: [Saturday, July 25, 2015 8:13 PM
。
我不知道这是怎么回事。任何帮助表示赞赏!谢谢!
答案 0 :(得分:2)
要捕获[...]
中第一次出现的文本,可以使用更加简化的正则表达式来实现:
\[([^]]*)]
请参阅demo
根据样本数据判断,不能有任何嵌套的[...]
序列,并且方括号内不应有杂散]
。因此,否定的角色类在这里看起来最好。
以下是正则表达式的含义:
\[
- 匹配文字[
([^]]*)
- 匹配并捕获第1组0个或更多字符而不是]
(注意我们不必在范围开头的字符类中转义]
)< / LI>
]
- 与文字]
匹配(请再次注意,这个结束方括号是明确的,因为之前有第一个转义[
。)这将匹配第一次出现而没有g
选项,并且您可以使用编程语言的相应函数/方法来获取此行为。
如果您需要在字符串/行的开头匹配第一个匹配项,请使用锚点^
(要强制执行多行模式,您需要/m
修饰符):
^\[([^]*&^]*)]
请参阅another demo
答案 1 :(得分:0)
你需要让.*
非贪婪的人在第一场比赛时停止:
\[(.*?)\] (.*?): (.*)
答案 2 :(得分:0)
这将提取值
使用示例
7/25/2015 8:40:18 PM Ghost: Saturday, July 25, 2015 8:13 PM Nathan:
有了这个
(\d+\/\d+\/+\d+ \d+\:\d+\:\d+ [A|P]M)[^:]*: ([A-Z][a-z]+\, [A-Z][a-z]* \d+, \d+ \d+:\d+ [A|P]M)