如何将标点符号作为Prolog中split_string中的单独元素

时间:2015-06-01 13:56:25

标签: string split prolog swi-prolog punctuation

我在Prolog做了一个任务(我是一个新手),我遇到了一个小问题。 我知道你可以将字符串拆分为Prolog中的元素列表,如下所示:

split_string("Hello, here I am!"," "," .!?-_'",Temp).

但这取出了基本的标点符号。它返回:

Temp = ['Hello','here','I','am'].

如何更改它以保持标点符号:

Temp = ['Hello',',','here','I','am','!'].

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

“split_string”不是标准的,但在我知道的实现中,你不能。来自ECLIPSe手册:

字符串String在分隔符处被拆分,并且删除了生成的子字符串周围的任何填充字符。 SubStrings 中不会出现分隔符和填充字符。

http://www.cs.uni-potsdam.de/wv/lehre/Material/Prolog/Eclipse-Doc/bips/kernel/stratom/split_string-4.html

**附录**

我们可以使用字符串函数播放一些来恢复“list”分隔符:

split_with_delimiters(String,Delimiters,Ignore,Result) :-
   split_string(String,Delimiters,"",FirstSplit),
   split_with_delimiters_aux(Ignore,String,FirstSplit,Result).

split_with_delimiters_aux(_,"",_,[]) :- !.

split_with_delimiters_aux(Ignore,String,[""|Q],Result) :- !,
   split_with_delimiters_aux(Ignore,String,Q,Result).

split_with_delimiters_aux(Ignore,String,[H|Q],[H|Result]) :-
   string_concat( H, Rest, String ), !,
   split_with_delimiters_aux(Ignore,Rest,Q,Result).

split_with_delimiters_aux(Ignore,String,Split,Result) :- 
   sub_string( String, 0, 1, RestL, Delimiter ),
   sub_string( String, 1, RestL, _, Rest ),
   sub_string( Delimiter, _, _, _, Ignore ), !,
   split_with_delimiters_aux(Ignore,Rest,Split,Result).

split_with_delimiters_aux(Ignore,String,Split,[Delimiter|Result]) :-
   sub_string( String, 0, 1, RestL, Delimiter ),
   sub_string( String, 1, RestL, _, Rest ),
   split_with_delimiters_aux( Ignore,Rest, Split, Result ).

提供以下结果:

?- split_with_delimiters("Hello, here I am!"," ,.!?-_'"," ",Res).
Res = ["Hello", ",", "here", "I", "am", "!"]

(如果我们在开始/结束时将字符串转换为/从列表中,事情可能会更容易)