用大写字母拆分

时间:2013-10-04 07:09:13

标签: prolog

我从页面中提取文本时遇到此问题。有时我会说这句话:

EatAppleGood

但我想要

Eat Apple Good
我一起获得了这三个词。我如何用大写字母拆分单词?

1 个答案:

答案 0 :(得分:3)

如果您使用的是原子与字符串(即字符代码列表),则代码会有所不同,因为这些表示形式实际上是非常不同的数据类型。

无论如何,用

复制输入
  • 当前单词,初始化为空
  • 一个累积器,保持目前为止看到的词语

然后决定如何处理空白等......

为了简单起见,让我们看看最惯用的方式:字符列表

% 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].