我最近爲我點燃的課程輸入了一篇文章,而且我的老師明確提出了一個字數限制,其中不包括引用片段。我想,爲什麼不製作一個能爲你計算的腳本?當然,我可以通過閱讀全文並忽略引號內的單詞來完成這種無聊的方式,但我有一種感覺,使用正則表達式和Array.count
有一個更好的方法。正如我對Regex幾乎一無所知,有人能幫助我/告訴我,Regex是不可能的嗎?正則表達式能否匹配引號外的所有單詞?
Tl; dr:使用正則表達式匹配文本引號外的所有單詞(或空格,無關緊要),並對結果數組中的項目進行計數。
我最近爲我點燃的課程輸入了一篇文章,而且我的老師明確提出了一個字數限制,其中不包括引用片段。我想,爲什麼不製作一個能爲你計算的腳本?當然,我可以通過閱讀全文並忽略引號內的單詞來完成這種無聊的方式,但我有一種感覺,使用正則表達式和Array.count
有一個更好的方法。正如我對Regex幾乎一無所知,有人能幫助我/告訴我,Regex是不可能的嗎?正則表達式能否匹配引號外的所有單詞?
Tl; dr:使用正則表達式匹配文本引號外的所有單詞(或空格,無關緊要),並對結果數組中的項目進行計數。
這是很容易的使用(當然或Perl)PCRE:
".*?"(*SKIP)(?!)|(?<!\w)'.*?'(?!\w)(*SKIP)(?!)|[\w']+
如果要處理多行引號,請使用g
修飾符和s
。
這裏的x
版本可讀性:
".*?" (*SKIP)(?!)
| (?<!\w)'.*?'(?!\w) (*SKIP)(?!)
| [\w]+
,第一部分將匹配裏面的一切"
或'
報價,並會丟棄它((*SKIP)(?!)
)。第二部分將匹配所有單詞(我在本例中包含'
作爲單詞的一部分)。 '
字符只會在開始/結束時被計爲報價邊界,以便讓您使用諸如之類的內容,而不是。
的修改:
\w+
更換[\w']+
。[\w']+
替換爲[-\w']+
。你明白了吧;)
下面是一個使用這個表達式一個完整的Perl腳本:
#!/usr/bin/env perl
use strict;
use warnings;
$_ = do { local $/; <> };
print scalar (() = /".*?"(*SKIP)(?!)|(?<!\w)'.*?'(?!\w)(*SKIP)(?!)|[\w']+/gs), "\n";
執行它傳遞一個文件或包含文本STDIN要算單詞輸入,它將輸出STDOUT上的字數。
這將更好地工作是這樣的:
字符總數 - 總和(引號內文字)
您可以使用此正則表達式來查找所有「援引」字符串:\「[^」] * \「
一般的解決方案會非常困難,因爲有些作品會有多段引號,第一段不會關閉引號,但第二段用引號打開。 - 全範圍將很難
另一方面,你也許可以逐段落,併爲每個段落累積一個非引號字數。當然,仍然會存在一些可能導致這種情況的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!";
,可以使用The Greatest Regex Trick Ever
"[^"]*"|(\w+)
和COUNT第一capture group的比賽。
\w+
匹配一個或多個單詞字符。
而且跳過單引號字符串:
"[^"]*"|'[^']*'|(\w+)
最佳答案,+1 – 2014-09-23 21:44:54
除引號之外,是否還有引號給您的文本? – Cratylus 2014-09-23 20:07:01
報價可以逃脫還是不平衡? – anubhava 2014-09-23 20:08:22
@Cratylus沒有,所有的文本中「和」的報價。 – Bluefire 2014-09-23 20:12:23