为什么这个regexp-replace不起作用?

时间:2014-03-29 00:48:47

标签: regex racket typed-racket

根据this,带有替换组\W+([.:,.!?;])(.)的正则表达式$1 $2完全符合我的要求 - 将空格和标点符号的运行减少到最后的标点符号,即空格,然后回到原处。就我的目的而言,这是完美的。

然而,当我尝试这个(regexp-replace* #rx"\\W+([.:,.!?;])(.)" str "\\1 \\2")时 我只是str未经修改。

> (define str "ihmb e.  ?. ! hrg; ; ")
> (regexp-replace* #rx"\\W+([.:,.!?;])(.)" str "\\1 \\2")
- : String
"ihmb e.  ?. ! hrg; ;"

但我期待ihmb e! hrg; "

这是在Typed Racket中,我刚刚更新到Racket 6.0

1 个答案:

答案 0 :(得分:2)

Racket支持基本和扩展正则表达式。

要使用包含\W的扩展“Perl-ish”语法,您需要使用pregexp#px(不是regexp#rx) :

(define str "ihmb e.  ?. ! hrg; ; ")
(regexp-replace* #px"\\W+([.:,.!?;])(.)" str "\\1 \\2")

the reference中读到,直到你看到这一段:

  

以下内容完成了pregexp的语法,该语法使用{和}有界重复,并使用\作为范围内外的元字符。

该段落上方的内容是基本的regexp#rx语法。以下内容为pregexp#px

虽然我不知道整个历史,但我认为基本级别是为了向后兼容并轻松移植某些正则表达式。

我个人总是使用pregexp / #px,所以我知道我可以使用完整的语法。