为什么这个正则表达式替换不起作用?

3
根据这个网站,正则表达式\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版本。


我在想它是否因为某些原因不喜欢\\W+在那里;尝试使用"(\\W)+([.:,.!?;])(.)" str "\\2 \\3" - l'L'l
1个回答

2

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

要使用包括\W在内的扩展"Perl-ish"语法,需要使用pregexp#px(不是regexp#rx):

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

这个参考文档中,向下阅读直到您看到以下段落为止:

以下内容完成了pregexp的语法,其中使用{和}进行界定重复,并在范围内外使用\作为元字符。

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

尽管我不知道整个历史,但我想基本级别是用于向后兼容和便于移植某些正则表达式。

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


2
谢谢,Greg!干得好。我还以为我可以只是简单地浏览完整个语法就行了... - Ben
那个文档页面有很多信息。我使用 #px,这样我就可以简单地使用那个页面上看起来有用的任何东西。 :) - Greg Hendershott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接