2011-10-07 113 views
10

我只是想知道是否有字符串拆分功能?例如:字符串拆分功能

> (string-split "19 2.14 + 4.5 2 4.3/- *") 
'("19" "2.14" "+" "4.5" "2" "4.3" "/" "-" "*") 

我还没有找到它并创建了我自己的。我不时地使用Scheme,所以我会很感激,如果你修复它,并建议更好的解决方案:

#lang racket 

(define expression "19 2.14 + 4.5 2 4.3/- *") 

(define (string-split str) 

    (define (char->string c) 
    (make-string 1 c)) 

    (define (string-first-char str) 
    (string-ref str 0)) 

    (define (string-first str) 
    (char->string (string-ref str 0))) 

    (define (string-rest str) 
    (substring str 1 (string-length str))) 

    (define (string-split-helper str chunk lst) 
    (cond 
    [(string=? str "") (reverse (cons chunk lst))] 
    [else 
    (cond 
     [(char=? (string-first-char str) #\space) (string-split-helper (string-rest str) "" (cons chunk lst))] 
     [else 
     (string-split-helper (string-rest str) (string-append chunk (string-first str)) lst)] 
     ) 
    ] 
    ) 
) 

    (string-split-helper str "" empty) 
) 

(string-split expression) 
+3

你应该把你的收盘括号在同一行作为最后一个表达式的一部分。这不是C :) – erjiang

+2

不,应该做任何你喜欢的事情。 – rightfold

回答

13

哦,我的!这是很多工作。如果我没有理解你的问题,我会用正则表达式分割此:

 
#lang racket 
(regexp-split #px" " "bc thtn odnth") 

=>

 
Language: racket; memory limit: 256 MB. 
'("bc" "thtn" "odnth") 
+3

通常像'#px“+”'或'#px“[[:space:]]”'更合适。 (如果是这样的话) –

6

正如其他有计划的参考,我使用irregex鸡蛋这样做的鸡计划:

(use irregex) 

(define split-regex 
    (irregex '(+ whitespace))) 

(define (split-line line) 
    (irregex-split split-regex line)) 

(split-line "19 2.14 + 4.5 2 4.3/- *") => 
("19" "2.14" "+" "4.5" "2" "4.3" "/" "-" "*") 
+1

如果你不想每次都复制这个定义,'(string-split)'也是'coops'蛋的一部分,它还有其他一些漂亮的字符串。不幸的是,它的文档页面没有记录。 – user1610406