2013-11-22 153 views
0

我試圖做一個正則表達式,如果可能的話,這將匹配從文本的所有引用的字符串。 一個例子:正則表達式匹配的所有引用的字符串

ABC released its full midseason schedule today, and it features premiere dates for several new shows, along with one rather surprising timeslot change.</p><p>First of all, ABC's previously reported plans for dramas 'Once Upon A Time,' 'Revenge,' 'Grey's Anatomy,' and 'Scandal' haven't changed. 

我想有結果:

's previously reported plans for dramas ' (not useful but i can manage it) 
'Once Upon A Time,' 
' ' 
'Revenge,' 
' 'Grey' 
'Grey's Anatomy,' 
etc 

,所以我會basicly需要兩次,每次報價相匹配。如果我使用標準的正則表達式,我不會有'從前'和'灰色的解剖學',原因很明顯。

感謝您的任何建議!

+6

這不是明擺着的。你有什麼嘗試,你使用什麼語言?要編寫正則表達式,您需要定義如何匹配特定字符集的邏輯。從你提供的一組輸出中,有一些字符串有2個單引號和3個。你認爲那個正則表達式是人類的,可以檢測到'Gray's Anatomy'應該是一個字符串而不是兩個?這可能是一個小小的開始[''(?!s)。* ?,''](http://regex101.com/r/gX9cO8)。你可以用另一種方法查看問題,找到第二個'

',然後用','分割。 – HamZa

+0

好吧,對不起,明顯我的意思是一個標準的正則表達式匹配兩個引號之間的任何東西。該語言是PHP/PCRE。我不能通過

分割,因爲這是一個例子,其他文本不會有p。 – aciobanu

+0

更清晰,我想要一個正則表達式,即給定一個輸入字符串像'文本1'文本2','文本3'會給我至少(我不介意任何額外的無用的匹配)文本1,文字2,文字3.謝謝。 – aciobanu

回答

2

下面是Perl的的解決方案,對於給定的例子工程。請參閱live demo

#!/usr/bin/perl -w 

use strict; 
use warnings; 

while (<DATA>) { 

# \1/ Starting at the beginning of a string or non-word character, 
# \2/ MATCH a single-quote character followed by a character that is 
#  *not* a single quote character, 
# \3/ And continue matching one or more times: 
#  - a white space character, 
#  - a word character, 
#  - a comma, 
#  - or a single-quote that is followed by a lower-case 's' or 't'. 
# \4/ And END the match on a single quote. 
# \5/ Continue searching for additional matches. 

    my @matches = /(?:\A|\W)('[^'](?:\w|\s|,|'(?=[st]\b))+')/g; 

#     \___1___/\__2_/\___________3__________/4/\5/ 

    print join("\n", @matches), "\n"; 
} 

__END__ 
'At the Beginning' ABC released its full midseason schedule today, and it features premiere dates for several new shows, along with one rather surprising timeslot change.</p><p>First of all, ABC's previously reported plans for dramas 'Once Upon A Time,' 'Revenge,' 'Grey's Anatomy,' and 'Scandal' haven't changed. 

預期輸出:

'At the Beginning' 
'Once Upon A Time,' 
'Revenge,' 
'Grey's Anatomy,' 
'Scandal' 
+0

謝謝!你是正則表達式完美的作品。我會分析它,所以我可以從中學習。 – aciobanu

+0

@aciobanu - 很高興聽到我的解決方案滿足您的需求。我的解決方案並不完全適合您的問題,但我認爲我明白了您的真正需求:查找在某些情況下可能包含引號的帶引號的表達式。棘手的部分是區分外部報價和內部報價。你的問題讓我有機會親自學習一點。 :-) – DavidRR

相關問題