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/