【问题标题】:Match and split by regular expression from start of string从字符串的开头按正则表达式匹配和拆分
【发布时间】:2018-03-29 10:27:35
【问题描述】:

我正在尝试从头开始制作终端解析器(用于解析器组合器)。我的方法是在输入字符串上使用regexp-match-positions*,如果在第一个位置找到模式,那么我们输出分割字符串。

到目前为止,这就是我所拥有的:

#lang racket/base

(require racket/match)

(define (make-terminal-parser pattern)
  (define (regexp-match-from-start pattern input)
    (match (regexp-match-positions* pattern input)
      [(list (cons 0 x) ...)
        (let ([index (car x)])
          (values (substring input 0 index)
                  (substring input index)))]

      [_ (error "Not found!")]))

  (lambda (input)
    (regexp-match-from-start pattern input)))

(define ALPHA (make-terminal-parser #rx"[a-zA-Z]"))

(ALPHA "hello")

我的ALPHA 似乎不起作用,我认为这是因为模式匹配不等同于任何东西。在 REPL 中,(regexp-match-positions* #rx"[a-zA-Z]" "hello") 输出我所期望的 ('((0 . 1) (1 . 2) etc.)),所以我真的不明白为什么它与 (list (cons 0 x) ...) 不匹配。如果我将正则表达式更改为#rx"h",那么它会正确拆分字符串;但显然这太具体了。

(在相关说明中:我不明白为什么我需要 (car x) 才能从匹配的缺点中获取实际的索引值。)

【问题讨论】:

    标签: regex pattern-matching racket parser-combinators


    【解决方案1】:

    原来我遇到的问题确实与我的模式匹配有关。我试图在(list (cons 0 x) ...) 上进行匹配,但文档暗示它只会匹配(0 . x) 的一个或多个元素的列表(其中x 是任意的)。这不是我想要的。

    列表是一系列cons,因此我将匹配条件更改为(cons (cons 0 x) _),这就是我想要的。

    这也解释了为什么我在之前的尝试中必须(car x)(list (cons 0 x) ...) 中的 x 匹配将匹配列表中每个 cons 的每个右侧元素,因此它会返回一个列表。例如,'((0 . 1) (0 . 2) (0 . 3)) 将匹配,x 将等于 '(1 2 3)

    所以,我的固定代码是:

    (define (make-terminal-parser pattern)
      (define (regexp-match-from-start pattern input)
        (match (regexp-match-positions pattern input)
          [(cons (cons 0 index) _)
              (values (substring input 0 index)
                      (substring input index))]
    
          [_ (error "Not found!")]))
    
      (lambda (input)
        (regexp-match-from-start pattern input)))
    

    n.b.,我也不需要在模式匹配中使用 regexp-match-positions 的星号版本,fwiw。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2022-10-17
      • 1970-01-01
      • 2018-11-23
      • 2023-03-17
      • 1970-01-01
      • 2019-10-15
      相关资源
      最近更新 更多