正则表达式无法正确捕获

时间:2015-07-26 08:39:23

标签: regex

我有following regex

~\[(.*)\] (.*): (.*)~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

我不知道这是怎么回事。任何帮助表示赞赏!谢谢!

3 个答案:

答案 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)