正则表达式用换行符拆分行,保留拆分键

时间:2021-02-08 00:03:19

标签: javascript regex parsing

我需要在结尾处将大文本拆分为单独的对话。所有对话都以日期和时间开始。如何使用正则表达式按日期+时间拆分,但仍将日期和时间保留在文本中,而不是实际将其与文本的其余部分拆分?

详情:

// Sample text:
22/06/2019, 21:54 - Name 1, (N: Si mute ? sa nu mai ma vibreze
22/06/2019, 21:55 - Name 2: Comunicat de interes public.
 "Pentru o viata sănătoasă sunt recomandate aceste setari."
22/06/2019, 21:55 - Name 3: ???????
24/06/2019, 18:14 - Name 2: Sa va explic, eu pana acum nu m-am jucat cu WhatsApp îndeajuns dar am cautat prin el acum si am descoperit ca  are muulte semne mai mult sau mai putin utile printre care si asta ?. acum intrebarea  e daca semnu  asta face referire la propozitia de mai sus sau e ce ne gandim cu totii? ?
25/06/2019, 10:11 - Name 1: ?psd? ?

我尝试使用像下面这样的简单 '\n',但它失败了,因为某些对话包含换行符:

$arrRows=stringData.split(/\n/); 
// this does not work for the item below, as it will split it into 2 conversations and I need to keep it as 1
'22/06/2019, 21:55 - Name 2: Comunicat de interes public.
 "Pentru o viata sănătoasă sunt recomandate aceste setari."'

所以我没有考虑使用正则表达式并在每一行的开头按日期/时间拆分,所以我使用了这个:

const regexRow=/(?<date>\d{2}\/\d{2}\/\d{4}), (?<time>\d{2}:\d{2})/;
$arrRows=stringData.split(regexRow);

,这没问题,但我需要保留文本中的日期和时间以在稍后阶段对其进行解析,对每一行使用以下代码:

const regexi = /(?<date>\d{2}\/\d{2}\/\d{4}), (?<time>\d{2}:\d{2}) - (?<person>.*): (?<link>https?[^ ]*)?(?<rest>.*)/;

1 个答案:

答案 0 :(得分:3)

要保留结果中的日期/时间,您可以在换行符上拆分,并在下一行的开头对日期/时间进行前瞻:

const stringData = `22/06/2019, 21:54 - Name 1, (N: Si mute ? sa nu mai ma vibreze
22/06/2019, 21:55 - Name 2: Comunicat de interes public.
 "Pentru o viata sănătoasă sunt recomandate aceste setari."
22/06/2019, 21:55 - Name 3: ???????
24/06/2019, 18:14 - Name 2: Sa va explic, eu pana acum nu m-am jucat cu WhatsApp îndeajuns dar am cautat prin el acum si am descoperit ca  are muulte semne mai mult sau mai putin utile printre care si asta ?. acum intrebarea  e daca semnu  asta face referire la propozitia de mai sus sau e ce ne gandim cu totii? ?
25/06/2019, 10:11 - Name 1: ?psd? ?`;

const lines = stringData.split(/\n(?=\d{2}\/\d{2}\/\d{4}, \d{2}:\d{2})/)
console.log(lines)