【问题标题】:String split function字符串拆分功能
【发布时间】:2011-12-03 06:07: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)

【问题讨论】:

  • 你应该把你的右括号放在最后一个表达式的同一行。这不是 C :)
  • 不,应该为所欲为。

标签: scheme racket


【解决方案1】:

天哪!这是很多工作。如果我正确理解您的问题,我会为此使用 regexp-split:

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

=>

语言:球拍;内存限制:256 MB。 '("bc" "thtn" "odnth")

【讨论】:

  • 通常#px" +"#px"[[:space:]]" 更合适。 (如果这是故意的话。)
【解决方案2】:

好吧,你可以使用普通的旧 string-split

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

它是球拍的一部分http://docs.racket-lang.org/reference/strings.html#%28def._%28%28lib._racket%2Fstring..rkt%29._string-split%29%29

【讨论】:

    【解决方案3】:

    作为其他 Schemers 的参考,我在 Chicken Scheme 中使用 irregex egg 进行了此操作:

    (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" "/" "-" "*")
    

    【讨论】:

    • 如果您不想每次都复制该定义,(string-split) 也是coops egg 的一部分,它还有一些其他不错的字符串内容。不幸的是,它的文档页面上没有记录。
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 2016-01-21
    • 2011-05-03
    • 1970-01-01
    • 2014-09-01
    • 2020-11-26
    • 1970-01-01
    • 2019-06-03
    相关资源
    最近更新 更多