2013-10-04 74 views
2

我有從頁面中提取文本的問題。有時候,我有這樣的話:用大寫字母分詞

EatAppleGood 

,但我想

Eat Apple Good 

我獲得了三個詞在一起。我怎樣才能用大寫字母分開單詞?

+0

有一拍:使用這個表達式http://jason.diamond.name/weblog/2009/08/15/split-camelcase-with-regular-expressions /並將其轉換爲序言 – Najzero

回答

3

如果您使用的是原子vs字符串(即char代碼列表),那麼這些代碼是相當不同的,因爲這些代表是關於真正不同的數據類型的。

總之,使輸入的副本

  • 當前字,初始化爲空
  • 累加器保持的話見過這麼遠

然後決定如何處理空白,等...

爲了保持簡單,讓我們看看最習慣的方式:字符列表

% words_to_lowercase(String, Word, WordsSeen, Result) 
% 
words_to_lowercase([C|Cs], WordR, Words, Result) :- 
    ( code_type(C, upper(L)) 
    -> reverse(WordR, Word), 
     WordsUpdated = [Word|Words], 
     Updated = [L] 
    ; Updated = [C|WordR], 
     WordsUpdated = Words 
    ), 
    words_to_lowercase(Cs, Updated, WordsUpdated, Result). 

words_to_lowercase([], W, Seen, Result) :- 
    reverse([W|Seen], Result). 

能產生

?- words_to_lowercase("EatAppleGood",[],[],R), maplist(atom_codes,L,R). 
R = [[], [101, 97, 116], [97, 112, 112, 108, 101], [100, 111, 111, 103]], 
L = ['', eat, apple, doog]. 

你可以在開始擺脫空字(例如)將在基本情況下,模式匹配:

words_to_lowercase([], W, Seen, Result) :- 
    reverse([W|Seen], [[]|Result]). 

編輯:哎呀,我忘了扭轉最後一個字...

words_to_lowercase([], W, Seen, Result) :- 
    reverse(W, R), 
    reverse([R|Seen], [[]|Result]). 

編輯關於正則表達式的建議,你從Najzero得到了評論,你可以很好地利用最近發佈的regex包。先從

?- pack_install(regex). 

然後

?- [library(regex)]. 
?- regex('([A-Z][a-z]+)+', [], 'EatAppleGood', L),maplist(atom_codes,A,L). 
L = [[69, 97, 116], [65, 112, 112, 108, 101], [71, 111, 111, 100]], 
A = ['Eat', 'Apple', 'Good']. 

,因爲我們有準備downcase_atom,我們可以做

?- regex('([A-Z][a-z]+)+', [], 'EatAppleGood', L),maplist(atom_codes,A,L),maplist(downcase_atom,A,D). 
L = [[69, 97, 116], [65, 112, 112, 108, 101], [71, 111, 111, 100]], 
A = ['Eat', 'Apple', 'Good'], 
D = [eat, apple, good].