Perl функция разделения до регулярного выражения, а не после - PullRequest
0 голосов
/ 08 апреля 2020
 #!/usr/bin/perl
use warnings ;
use strict ;

use Data::Dumper qw(Dumper);
my $str = " 30th Mar 2020 5:53:18 pm Elvis Presly: BJ: Bloomberg Runs30th Mar 2020 5:53:27 pm Elvis Presly: DS: ICE DATA = INC101848366130th Mar 2020 6:42:43 pm Boris Putin: Cortese's ICE logs is for the Bloomberg Runs issue30th Mar 2020 6:43:28 pm Elvis Presly: yeap31st Mar 2020 4:11:22 am Indie Rock: VK : RE: XS2018777099 & XS2018777172 - INC1018491954 31st Mar 2020 6:31:17 am Dash Riprock: NW: RE: SABSM 6.125 YTW - INC101849584331st Mar 2020 6:52:06 am Dash Riprock: KB: RE: Cpty issue for Trader on CDS STATS bookings - SDS 42625375 - PENDING ROKOS CAPITAL MANAGEMENT (JERSEY) LP - INC101849631331st Mar 2020 7:26:40 am Dash Riprock: AP: RE: Rolling 7yrs - INC101849710231st Mar 2020 7:45:36 am Dash Riprock: JK: RE: Chris White books - INC101849738031st Mar 2020 8:11:10 am Charlie Brown: KB: RE: BOOKBUILDER Allocs Delays - urgent - INC101849791631st Mar 2020 8:21:15 am Charlie Brown: VK: RE: Can you get me set up to view TRAX History?  - INC101849813331st Mar 2020 8:30:36 am Charlie Brown: WJ: RE: Bulking Booking P&L - INC101849829231st Mar 2020
";



#my @words = split / /, $str ;
my @words = split /(\d+th|st|rd)/, $str ;


print Dumper \@words;

Split делает то, что должно

$VAR1 = [
          ' ',
          '30th',
          ' Mar 2020 5:53:18 pm Elvis Presly: BJ: Bloomberg Runs',
          '30th',
          ' Mar 2020 5:53:27 pm Elvis Presly: DS: ICE DATA = INC',
          '101848366130th', (this did not split  - it happens) 
          ' Mar 2020 6:42:43 pm Boris Putin: Cortese\'s ICE logs is for the Bloomberg Runs 
issue',
          '30th',
          ' Mar 2020 6:43:

Однако, что мне действительно нужно, так это конец строки перед датой, поэтому данные отображаются как

$VAR1 = [
          ' ',
          '30th Mar 2020 5:53:18 pm Elvis Presly: BJ: Bloomberg Runs',
          '30th Mar 2020 5:53:27 pm Elvis Presly: DS: ICE DATA = INC',
          '101848366130th',
          ' Mar 2020 6:42:43 pm Boris Putin: Cortese\'s ICE logs is for the Bloomberg Runs 
issue',
          '30th Mar 2020 6:43:

Ответы [ 3 ]

4 голосов
/ 08 апреля 2020

При использовании разделения необходимо указать, что находится между битами, которые вы хотите сохранить. В этом случае разделителем является строка длиной 0, за которой следует дата. Для этого вы можете использовать следующее:

split /(?=\d+(?:th|st|nd|rd))/, $str 
3 голосов
/ 08 апреля 2020

Вам также нужно nd для "секунды".

split /(?=\d{2}(?:st|nd|rd|th) \w{3} \d{4})/a, $str;

/a вызывает ASCII-интерпретацию \d, поэтому такие вещи, как "६", не совпадают.

Нулевое упреждающее утверждение (?=) используется для разделения строки непосредственно перед началом матча, то есть в начале даты (спасибо ikegami за идею).

Вы можете также используйте

split /(\d{2}(?:st|nd|rd|th) \w{3} \d{4}(?: \d{1,2}:\d{2}:\d{2} [ap]m)?) ?/a

для разделения временных отметок:

$VAR1 = [
          ' ',
          '30th Mar 2020 5:53:18 pm',
          'Basant Jain: BJ: Bloomberg Runs',
          '30th Mar 2020 5:53:27 pm',
          'Basant Jain: DS: ICE DATA = INC1018483661',
          # ...
          '31st Mar 2020 8:30:36 am',
          'Kishan Bholah: WJ: RE: Bulking Booking P&L - INC1018498292',
          '31st Mar 2020'
        ];

Обратите внимание, что \d+st|nd не делает то, что вам нужно: \d+ является частью только первой альтернативы, вам нужно использовать скобки, чтобы сгруппировать вещи вместе. Я использовал несовпадающий вариант (?:...), чтобы split не включил совпадение в возвращаемое значение.

0 голосов
/ 08 апреля 2020

Непонятно, почему split используется OP.

В качестве альтернативы заменитель может использоваться для ввода новой строки до даты.

split добавлено для размещения строк в массиве lines для достижения желаемого результата.

use strict;
use warnings;
use feature 'say';

my $str = " 30th Mar 2020 5:53:18 pm Elvis Presly: BJ: Bloomberg Runs30th Mar 2020 5:53:27 pm Elvis Presly: DS: ICE DATA = INC101848366130th Mar 2020 6:42:43 pm Boris Putin: Cortese's ICE logs is for the Bloomberg Runs issue30th Mar 2020 6:43:28 pm Elvis Presly: yeap31st Mar 2020 4:11:22 am Indie Rock: VK : RE: XS2018777099 & XS2018777172 - INC1018491954 31st Mar 2020 6:31:17 am Dash Riprock: NW: RE: SABSM 6.125 YTW - INC101849584331st Mar 2020 6:52:06 am Dash Riprock: KB: RE: Cpty issue for Trader on CDS STATS bookings - SDS 42625375 - PENDING ROKOS CAPITAL MANAGEMENT (JERSEY) LP - INC101849631331st Mar 2020 7:26:40 am Dash Riprock: AP: RE: Rolling 7yrs - INC101849710231st Mar 2020 7:45:36 am Dash Riprock: JK: RE: Chris White books - INC101849738031st Mar 2020 8:11:10 am Charlie Brown: KB: RE: BOOKBUILDER Allocs Delays - urgent - INC101849791631st Mar 2020 8:21:15 am Charlie Brown: VK: RE: Can you get me set up to view TRAX History?  - INC101849813331st Mar 2020 8:30:36 am Charlie Brown: WJ: RE: Bulking Booking P&L - INC101849829231st Mar 2020
";

$str =~ s/(\d{1,2}(th|st|nd|rd) \w{3} \d{4})/\n$1/g;

say $str;

my @lines = split "\n", $str;

say Dumper(\@lines);
...