2
4

3 回答 3

1

Multiline 在 javascript 中不能以这种方式工作,但您可以使用[\s\S]. 这个类也匹配每个字符和 \n。请注意,*?而不是*在它之后,以阻止它变得贪婪,并且只到 1st END

^([0-9]{4}|[0-9]{2})[\/]([0]?[1-9]|[1][0-2])[\/]([0]?[1-9]|[1|2][0-9]|[3][0|1]), ([A|P])M([1-9]|1[0-2]):([0-5]\d) - (.*?): ([\s\S]*?END)$

见:https ://regex101.com/r/mT8rI4/3

于 2016-01-31T12:41:55.113 回答
1

点 ( .) 与换行符不匹配。有一个匹配所有内容的字符类 ( [\S\s]),但您不想在没有预防措施的情况下使用它 - 否则[\S\s]*会一次匹配所有条目。

所以你需要告诉正则表达式引擎在下一个匹配开始时停止匹配。我们可以为此使用否定的前瞻断言,我们只需将时间戳模式输入其中:

/^([0-9]{4}|[0-9]{2})\/(0?[1-9]|1[0-2])\/(0?[1-9]|[12][0-9]|3[01]), ([AP])M([1-9]|1[0-2]):([0-5]\d) - ([^:]*): ((?:(?!^([0-9]{4}|[0-9]{2})\/(0?[1-9]|1[0-2])\/(0?[1-9]|[12][0-9]|3[01]), ([AP])M([1-9]|1[0-2]):([0-5]\d))[\S\s])*)/gm

在 regex101.com 上进行实时测试。

于 2016-01-31T12:44:23.287 回答
0

这是一个单一的正则表达式,它将匹配您需要的字符串:

^(\d{4}|\d{2})\/(0?[1-9]|1[0-2])\/(0?[1-9]|[12]\d|3[01]), ([AP])M([1-9]|1[0-2]):([0-5]\d) - (.*?): ((?:(?!(?:\d{4}|\d{2})\/(?:0?[1-9]|1[0-2])\/(?:0?[1-9]|[12]\d|3[01]))[\s\S])*)(?=\n|$)

演示

最后一个捕获组不再是一个贪婪的点匹配.*,而是一个经过调整的贪婪令牌(?:(?!([0-9]{4}|[0-9]{2})\/(0?[1-9]|1[0-2])\/(0?[1-9]|[12][0-9]|3[01]))[\s\S])*,匹配直到字符串末尾或日期模式的所有内容。

如果我们展开它以提高效率:

^(\d{4}|\d{2})\/(0?[1-9]|1[0-2])\/(0?[1-9]|[12]\d|3[01]), ([AP])M([1-9]|1[0-2]):([0-5]\d) - (.*?): (\D*(?:\d(?!(?:\d{3}|\d)\/(?:0?[1-9]|1[0-2])\/(0?[1-9]|[12]\d|3[01]))\D*)*)(?=\n|$)

查看另一个演示

于 2016-01-31T21:44:30.110 回答