regex - Racket 模式匹配做非贪婪匹配

标签 regex pattern-matching racket

Racket语言中的模式匹配有...来进行贪婪匹配(匹配0个或更多),如果我想匹配这样的东西怎么办:

#lang racket

(define (Modifier? t)  (equal? t "Modifier"))

(define (SimpleName? t)  (equal? t "SimpleName"))

(define (SimpleType? t)  (equal? t "SimpleType"))

(define (FieldDeclaration? t)  (equal? t "FieldDeclaration"))


(match (match '("FieldDeclaration" ("Modifier") ("Modifier") ("SimpleType") ("VariableDeclarationFragment" ("SimpleName") ("StringLiteral")))
   [(list (? FieldDeclaration? id) (? Modifier? m) ... (? SimpleType? t) (list _ (? SimpleName? n)) _ ...)
'yes]

   [else 'no] )

打印 'no ,而我期望 'yes 。我猜这是由 ... which do a greedy matching 引起的(只需在链接页面中搜索“贪婪”),但是我对此不太确定......)

列表中可以有 0 到 3 个 ("Modifier") ,那么如何匹配这个表单?(实际上,还有更多的事情要做在函数 XXX? 中,所以我必须使用形式 (? XXX? x) )

PS:有可能extend the matching syntax所以我可以使用像 n_m 这样的东西,这意味着匹配 n 到 m 次,就像正则表达式中的 {n,m} 一样?

最佳答案

实际上...并不贪婪,而且你已经非常接近拥有它了 在职的。两个问题:

首先,你的三个谓词是错误的。由于您的输入是 例如("Modifier") 不是 "Modifier",你想要 匹配 (list "Modifier") 而不是 "Modifier"

(define (Modifier? t)
  (equal? t (list "Modifier")))

(define (SimpleName? t)
  (equal? t (list "SimpleName")))

(define (SimpleType? t)
  (equal? t (list "SimpleType")))

这个谓词没问题:

(define (FieldDeclaration? t)
  (equal? t "FieldDeclaration"))

其次,我认为你在最后部分放错了结束括号 你的模板 - 它应该是 (list _ (? SimpleName? n) _ ...) 不是 (list _ (? SimpleName? n)) _ ...

这是完整的匹配表达式,我添加了一些换行符来使其 对我来说更具可读性:

(match '("FieldDeclaration"
         ("Modifier") ("Modifier")
         ("SimpleType")
         ("VariableDeclarationFragment" ("SimpleName") ("StringLiteral")))
  [(list (? FieldDeclaration? id)
         (? Modifier? m) ...
         (? SimpleType? t)
         (list _ (? SimpleName? n) _ ...))
   'yes]
  [_ 'no])

这将打印'yes

关于regex - Racket 模式匹配做非贪婪匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23721641/

相关文章:

正则表达式匹配任何字符,包括空格

javascript - 从域 REGEX javascript 获取主机名

pattern-matching - OCaml 模式与非常量匹配

scheme - '(list 1 2) 在 Scheme 中是什么意思?

scheme - Racket 中的while循环?

scheme - 想要在程序未运行时更改 Racket GUI 应用程序标题(在任务栏上)

python - 多个短语匹配 Python Pandas

Java正则表达式分割字符串不起作用

regex - 第 n 次出现正则表达式的 sed 打印行

regex - 以编程方式,Youtube Content ID如何工作?