在正则表达式中忽略回车换行

4

我目前正在尝试使用Javascript解析对话文件。以下是这样一段对话的示例。

09/05/2016,13:11 - Joe Bloggs:嘿Jane,你好吗?你在伦敦的日期是什么?我意识到六月并不遥远,所以可能会提前订火车票! 09/05/2016,13:47 - Jane Doe:嘿!我在6月12日至16日在伦敦!希望你能来:)很抱歉我只能在周日之后才能到那里! 09/05/2016,14:03 - Joe Bloggs:好的,我会和我的老板说的!我刚刚请求了11月/ 12月的5个星期去澳大利亚旅行,所以我会看看是否可以谈判其他日期!
你们学校11月份什么时候结束?我想先去珀斯再去东海岸! 09/05/2016,22:32 - Jane Doe:哦,如果你来澳大利亚就太棒了!如果你不能在六月请更多的假期,我完全理解。
我11月初就要放学了!所以如果你来这里应该已经结束了。 09/05/2016,23:20 - Joe Bloggs:我也许可以请几天假,你周日何时飞往伦敦?
太好了!我需要和其他人商量确保他们在。我迫不及待地想去,但是还有很长时间! 09/05/2016,23:30 - Jane Doe:我早上7点半左右飞到,所以整个白天都有时间!
我相信这一年会很快过去,因为现在已经是五月了哈哈

我的当前正则表达式看起来像这样

(\d{2}\/\d{2}\/\d{4}),\s(\d(?:\d)?:\d{2})\s-\s([^:]*):\s(.*?)(?=\s*\d{2}\/|$)/gm

我的方法已经接近完成,按预期给出了4个分组。
{
    "group": 1,
    "value": "09/05/2016"
  },
  {
    "group": 2,
    "value": "13:11"
  },
  {
    "group": 3,
    "value": "Joe Bloggs"
  },
  {
    "group": 4,
    "value": "Hey Jane how're you doing?  what dates are you in London again? I realise that June isn't actually that far away so might book my trains down sooner than later!"
  }

当一个消息(组4)包含回车符时,问题就出现了。 (请参见示例代码片段中第3行的消息)。

我进行了一些研究,并且使用

[\s\S]
无法解决我的问题。该模式只是停止并转到下一个出现。

对于第三次对话,消息在回车符处被切断。

DEMO

任何帮助将不胜感激!


你的意思是需要一种匹配除 CR 以外的任何字符的方法吗?使用 [^\r]。或者是除 LF 以外的任何字符?那么使用 [^\n] - Wiktor Stribiżew
@WiktorStribiżew 我希望这个模式在到达CR后不会终止。 - stepwise_refinement
你是指 0x0D 这个字符的 CR,还是指“这一行到此结束”的 CR? - Aaron
1个回答

3

尝试

(\d{2}\/\d{2}\/\d{4}),\s(\d{1,2}:\d{2})\s-\s([^:]*):\s+(.*(?:\n+(?!\n|\d{2}\/).*)*)

(https://regex101.com/r/sA3sB8/2)扫描到行尾,然后使用重复组首先检查新行是否以\d\d/(下一行日期的开头)开头,如果没有,则捕获整个行。

如果您担心两个数字后跟斜杠可能会遇到任何边缘情况,那么可以使否定的前瞻更具体。这会增加步骤数,但会使它稍微更安全。

如果用户实际上输入了一个换行符,后跟该语法中的日期,那么可能会出现问题,因为它在那一点停止匹配。不过,我怀疑他们也不会包括逗号和24小时制时间,所以这可能是处理该场景的一种方式。

示例:

09/05/2016, 23:36 - Jane Doe: Great! Let me give you my travel details:

10/01/2016 @ 6am - Arrive at the station
10/01/2016 @ 7am - Get run over by a drunk horse carriage (the driver and the horse were both sober; the carriage stayed up a bit late to drink)
10/01/2016 @ 7:15am - Pull myself out from under the carriage and kick at its wheels vehemently.

09/05/2016, 23:40 - Joe Bloggs: Haha, sounds great.

这只是一个示例(同时使用相应的修复添加更多细节到前瞻以处理它),仅仅是为了展示用户可能添加的文本,可能会破坏正则表达式的特定版本。


太好了,我没有想到那个。谢谢@OnlineCop! - stepwise_refinement
请注意,regex101不支持CRLF结尾,只支持LF。在测试应该包含CR符号的输入时,请勿依赖regex101。 - Wiktor Stribiżew
2
那就是,直到有人特别想打破这个功能。那么这可能会成为第一次尝试。 - Aaron
1
更新了一些内容,应该能够更好地处理那种边缘情况。 - OnlineCop
1
@WiktorStribiżew: 这是一个很好的观点。但不仅regex101在处理CR时存在问题。如果你希望它能同时适用于LF和CRLF,可以尝试使用\r?\n - OnlineCop
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接