2014-09-23 32 views
1

我最近爲我點燃的課程輸入了一篇文章,而且我的老師明確提出了一個字數限制,其中不包括引用片段。我想,爲什麼不製作一個能爲你計算的腳本?當然,我可以通過閱讀全文並忽略引號內的單詞來完成這種無聊的方式,但我有一種感覺,使用正則表達式和Array.count有一個更好的方法。正如我對Regex幾乎一無所知,有人能幫助我/告訴我,Regex是不可能的嗎?正則表達式能否匹配引號外的所有單詞?

Tl; dr:使用正則表達式匹配文本引號外的所有單詞(或空格,無關緊要),並對結果數組中的項目進行計數。

+0

除引號之外,是否還有引號給您的文本? – Cratylus 2014-09-23 20:07:01

+0

報價可以逃脫還是不平衡? – anubhava 2014-09-23 20:08:22

+0

@Cratylus沒有,所有的文本中「和」的報價。 – Bluefire 2014-09-23 20:12:23

回答

1

這是很容易的使用(當然或Perl)PCRE:

".*?"(*SKIP)(?!)|(?<!\w)'.*?'(?!\w)(*SKIP)(?!)|[\w']+ 

如果要處理多行引號,請使用g修飾符和s

Demo

這裏的x版本可讀性:

".*?"    (*SKIP)(?!) 
| (?<!\w)'.*?'(?!\w) (*SKIP)(?!) 
| [\w]+ 

,第一部分將匹配裏面的一切"'報價,並會丟棄它((*SKIP)(?!))。第二部分將匹配所有單詞(我在本例中包含'作爲單詞的一部分)。 '字符只會在開始/結束時被計爲報價邊界,以便讓您使用諸如之類的內容,而不是

的修改:

  • 計數文本爲兩個詞,與\w+更換[\w']+
  • 要計算像婆婆這樣的文字作爲一個單詞而不是3個,請將[\w']+替換爲[-\w']+

你明白了吧;)

下面是一個使用這個表達式一個完整的Perl腳本:

#!/usr/bin/env perl 
use strict; 
use warnings; 

$_ = do { local $/; <> }; 
print scalar (() = /".*?"(*SKIP)(?!)|(?<!\w)'.*?'(?!\w)(*SKIP)(?!)|[\w']+/gs), "\n"; 

執行它傳遞一個文件或包含文本STDIN要算單詞輸入,它將輸出STDOUT上的字數。

+0

這似乎不適用於',only'。 – Bluefire 2014-09-23 20:18:46

+0

@Bluefire該死的,是的,我會在一分鐘內處理好這件事 – 2014-09-23 20:20:33

+0

不,不理我。剛剛意識到,如果考慮到了,撇號也是如此。 – Bluefire 2014-09-23 20:22:09

0

這將更好地工作是這樣的:

字符總數 - 總和(引號內文字)

您可以使用此正則表達式來查找所有「援引」字符串:\「[^」] * \「

1

一般的解決方案會非常困難,因爲有些作品會有多段引號,第一段不會關閉引號,但第二段用引號打開。 - 全範圍將很難

另一方面,你也許可以逐段落,併爲每個段落累積一個非引號字數。當然,仍然會存在一些可能導致這種情況的pathalogical案例(比如一個包含標點符號列表的段落,包括引號)。

在Perl,假設getWordCount子存在於某個地方,並假設你已經在某種程度上分裂您的文檔成段的一個數組叫@paragraphs,這可能是這樣的:根據要求

my $wordCount = 0; 
foreach my $paragraph (@paragraphs) { 
    $paragraph =~ s/\".*?\"/g; # remove all quotation marks which have a matching quotation mark 
    $paragraph =~ s/\".*$/g; # remove quotation marks which go to the end of the paragraph 
    $wordCount += getWordCount($paragraph); 
} 
print "There are $wordCount words outside of quotations, maybe!"; 
相關問題