如何在scheme中解析这个字符串?

时间:2016-01-24 20:34:46

标签: regex scheme racket

我有一个看起来像这样的字符串

"21 4\n21 2 _ _ 19 11\n 12 _ _ 1 _ _\n_ _ _ 7 13 _"

(21和4之间有空格,21和2,2和_等)

我想循环遍历它,提取每个数字,字符_或\ n。

(基本上将空格上的字符串拆分为\ n)

使用子字符串不起作用,因为某些元素有多个字符(如21或13)

如果最简单的方法是将字符串转换为像

这样的列表
["21" "4" "\n" "21" "2" "_" "_" "19" "11" "\n"...]

这样会很好,但不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

这是让你入门的东西。这不使用正则表达式 - 只需重复使用read

#lang racket

(define (parse-line line)
  (define in (open-input-string line))
  (for/list ([sym (in-port read in)])
    (~a sym)))

(define (parse str)
  (define in (open-input-string str))
  (for/list ([line (in-lines in)])
    (parse-line line)))


(parse "21 4\n21 2 _ _ 19 11\n 12 _ _ 1 _ _\n_ _ _ 7 13 _")

输出结果为:

'(("21" "4") 
  ("21" "2" "_" "_" "19" "11") 
  ("12" "_" "_" "1" "_" "_") 
  ("_" "_" "_" "7" "13" "_"))

答案 1 :(得分:2)

分割你的字符串的正则表达式将是

正则表达式/[\d]+|_|\\n/g

<强>解释

[\d]+搜索数字。

_搜索下划线。

\\n搜索\n。需要\双倍逃避。

| OR 条件。三者中的任何一个。

g允许全局搜索。

Regex101 Demo