问问题
1427 次
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)$
于 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
于 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 回答