2017-02-22 24 views
0

Я хочу разбить фразу на большее число предложений с разделителем данного слова. Пример ввода фразы:
Разделите фразу на предложения, которые начинаются с определенного слова

You must go right now. 
She was walking quickly to the mall. 
He should wait before going swimming. 
Those girls are not trying very hard. 
Ted might eat the cake. 
You must go right now. 
You can’t eat that! 
My mother is fixing us some dinner. 
Words were spoken. 
These cards may be worth hundreds of dollars! 
The teacher is writing a report. 
You have woken up everyone in the neighborhood. 

То, что я ожидал получить будет:
1)

You must go right now. 
She was walking quickly to the mall. 
He should wait before going swimming. 
Those girls are not trying very hard. 
Ted might eat the cake. 

2)

You must go right now. 

3)

You can’t eat that! 

И так далее ...

Используя этот код мне удалось получить все из них, за исключением последнего (потому что нет You в финале фразы для соответствия):

my $string = 'the phrase above'; 
my @results = ($string =~ /.+?(?=You)/g); 

Также я заметил, что если строка содержит разделители \n, регулярное выражение останавливается в первой строке.

+0

@AvinashRaj Это ничего не поймает :( –

+0

О, тогда сделайте разбивку с помощью '/ [\ r \ n] (? = You) /' regex .. –

+0

@AvinashRaj Это поймает всю фразу. –

ответ

1

Просто выполните простой раскол вместо соответствия.

my @text = split /[\r\n](?=You)/, $text; 

Это будет делать разделение на новой строки или возврата каретки, которая была существует только до того как строки You.

Для того, чтобы сделать чистый раскол, лучше добавить +, т.е. [\r\n]+

+0

Я не ставил' [\ r \ n] + ', вместо этого я использовал необязательный' [\ r \ n]? ', потому что фраза может или не может быть многострочным. –

+0

тогда это должно быть '(? <= [.!?]) \ S * (? = You)' –