检查Racket中的用户输入

时间:2017-10-18 16:17:30

标签: racket

我正在从用户那里获得一个输入中的tex-field%的输入,看起来像这样:

open button a = fwd; button b = xxx; button s = xxx; close

我已经确认它分别在开头和结尾都包含open和close。但是现在我需要存储基于分号的每个子串,以便在最后检查它们的分号等等。例如,在上面的示例中,它应该在向量/列表中存储3个子字符串(以较容易者为准)。它将存储为:

button a = fwd;
button b = xxx;
button s = xxx;

;input is the name of the string the user enters
(define vec (apply vector (string-split input)))
(define vecaslist(vector->list vec))
(define removedopen (cdr vecaslist))
(define withoutopenandclose (reverse(cdr(reverse removedopen))))
(define stringwithoutopen (string-replace input "open " ""))
(define stringtoderivate (string-replace stringwithoutopen " close" ""))
(define tempvec (apply vector (string-split stringtoderivate ";" #:trim? #f #:repeat? #t)))

尝试用分号拆分并放在向量中,但它会删除分号。当我打印矢量的长度时,它正确显示3,但我想保留分号。

1 个答案:

答案 0 :(得分:0)

您可以将string-splitregular expression分隔符一起使用,如下所示:

(string-split input #rx"(open | close)|(?<=;).")

将输出列表:

'("button a = fwd;" "button b = xxx;" "button s = xxx;")

分解正则表达式:

  • ( exp )匹配任何子表达式&#34; exp&#34;。因此,(open )匹配输入中的子表达式"open "。与( close)类似,匹配" close"

  • (?<= exp )会做一个积极的后顾,如果"exp"匹配前一个匹配。

  • .匹配任何内容,例如空格,字符等。

  • |匹配前面的表达式,或之后,首先尝试左边的表达式。