我从页面中提取文本时遇到了这个问题。有时我有这样的话:
EatAppleGood
但我想要
Eat Apple Good
我把这三个词一起搞定了。如何用大写字母拆分单词?
如果您使用原子与字符串(即字符代码列表),则代码会有很大不同,因为这些表示是关于真正不同的数据类型。
无论如何,制作输入的副本
然后决定如何处理空白等...
为了简单起见,让我们看看最惯用的方式:字符列表
% 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 获得了评论,您可以充分利用最近发布的正则表达式包。从...开始
?- 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].