在Racket中摆弄我正在尝试编写一个使用正则表达式来处理模式的简单词法分析器,但它似乎不想使用元字符\w
。
#lang racket
(define (tokenize-broken str)
(match str
["\"" 'StringDelim]
[(regexp #rx"#\\w+") 'Message]
[_ 'Undefined]))
(define (tokenize-working str)
(match str
["\"" 'StringDelim]
[(regexp #rx"#[a-zA-Z_]+") 'Message]
[_ 'Undefined]))
现在,当我尝试在repl中运行它时,我得到了这个:
> (tokenize-broken "#msg")
'Undefined
> (tokenize-working "#msg")
'Message
那么这里发生了什么?为什么我不能让\w
工作?它在支持正则表达式的其他语言中工作正常,为什么不在这里?
答案 0 :(得分:2)
我认为\w
中未包含regexp
。试试pregexp
(即“Perl”regexp),然后使用#px
代替#rx
。
(define (tokenize-fixed str)
(match str
["\"" 'StringDelim]
[(pregexp #px"#\\w+") 'Message]
[_ 'Undefined]))
> (tokenize-fixed "#msg")
'Message