内容简介:翻译自:https://stackoverflow.com/questions/4334897/functionally-split-a-string-by-whitespace-group-by-quotes
在Clojure [1]中编写惯用的函数代码,如何编写一个用空格分割字符串但保持引用短语完整的函数?一个快速的解决方案当然是使用正则表达式,但没有它们就可以实现.快速浏览一下似乎很难!我在命令式语言中写了类似的但我想看看功能性的递归方法是如何工作的.
快速查看我们的功能应该做什么:
"Hello there!" -> ["Hello", "there!"] "'A quoted phrase'" -> ["A quoted phrase"] "'a' 'b' c d" -> ["a", "b", "c", "d"] "'a b' 'c d'" -> ["a b", "c d"] "Mid'dle 'quotes do not concern me'" -> ["Mid'dle", "quotes do not concern me"]
我不介意引号之间的间距是否变化(因此可以先使用空格分割简单).
"'lots of spacing' there" -> ["lots of spacing", "there"] ;is ok to me
[1]这个问题可以在一般水平上回答,但我想Clojure中的功能方法可以轻松地转换为Haskell,ML等.
这是一个返回lazy seq of words / quoted strings的版本:
(defn splitter [s] (lazy-seq (when-let [c (first s)] (cond (Character/isSpace c) (splitter (rest s)) (= \' c) (let [[w* r*] (split-with #(not= \' %) (rest s))] (if (= \' (first r*)) (cons (apply str w*) (splitter (rest r*))) (cons (apply str w*) nil))) :else (let [[w r] (split-with #(not (Character/isSpace %)) s)] (cons (apply str w) (splitter r)))))))
试运行:
user> (doseq [x ["Hello there!" "'A quoted phrase'" "'a' 'b' c d" "'a b' 'c d'" "Mid'dle 'quotes do not concern me'" "'lots of spacing' there"]] (prn (splitter x))) ("Hello" "there!") ("A quoted phrase") ("a" "b" "c" "d") ("a b" "c d") ("Mid'dle" "quotes do not concern me") ("lots of spacing" "there") nil
如果输入中的单引号与正确匹配,则最终打开单引号中的所有内容都将构成一个“单词”:
user> (splitter "'asdf") ("asdf")
更新:另一个版本回答edbond的评论,更好地处理单词中的引号字符:
(defn splitter [s] ((fn step [xys] (lazy-seq (when-let [c (ffirst xys)] (cond (Character/isSpace c) (step (rest xys)) (= \' c) (let [[w* r*] (split-with (fn [[x y]] (or (not= \' x) (not (or (nil? y) (Character/isSpace y))))) (rest xys))] (if (= \' (ffirst r*)) (cons (apply str (map first w*)) (step (rest r*))) (cons (apply str (map first w*)) nil))) :else (let [[w r] (split-with (fn [[x y]] (not (Character/isSpace x))) xys)] (cons (apply str (map first w)) (step r))))))) (partition 2 1 (lazy-cat s [nil]))))
试运行:
user> (doseq [x ["Hello there!" "'A quoted phrase'" "'a' 'b' c d" "'a b' 'c d'" "Mid'dle 'quotes do not concern me'" "'lots of spacing' there" "Mid'dle 'quotes do no't concern me'" "'asdf"]] (prn (splitter x))) ("Hello" "there!") ("A quoted phrase") ("a" "b" "c" "d") ("a b" "c d") ("Mid'dle" "quotes do not concern me") ("lots of spacing" "there") ("Mid'dle" "quotes do no't concern me") ("asdf") nil
翻译自:https://stackoverflow.com/questions/4334897/functionally-split-a-string-by-whitespace-group-by-quotes
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Go中单引号和双引号和反引号(飘号)
- JS声明对象时属性名加引号与不加引号的问题及解决方法
- 如何设置 Visual Studio Code 格式化 React 时不要将单引号转为双引号?
- Linux 中引号的那些事
- MySQL中一个双引号错位引发的血案
- Javascript:在HTML中转义双引号
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
电脑报(上下册)
电脑报社 / 西南师范大学出版社 / 2006-12-01 / 45.00元
全套上、下两册,浓缩2006年电脑报精华文章。附录包含70余篇简明IT应用指南,覆盖软件、硬盘、数码、网络四大领域。配赠权威实用的2006-2007中国计算机年鉴DVD光盘,近1.4GB海量信息与资源超值奉献。8大正版超值软件,涵盖系统维护、系统安全、办公应用、多媒体娱乐等四大领域。微软、腾讯、友立等知名厂商,新年献礼。提供2006-2007全系列硬件、数码产品资讯,兼具知识性与资料性。官方网站全......一起来看看 《电脑报(上下册)》 这本书的介绍吧!