2

我从页面中提取文本时遇到了这个问题。有时我有这样的话:

EatAppleGood

但我想要

Eat Apple Good

我把这三个词一起搞定了。如何用大写字母拆分单词?

4

1 回答 1

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 获得了评论,您可以充分利用最近发布的正则表达式包。从...开始

?- 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].
于 2013-10-04T08:34:30.130 回答