正则表达式与方案中的字符串不匹配,但可以在其他平台上使用

时间:2019-06-15 12:18:33

标签: scheme guile

我正在使用string-match模式运行[ \[\]a-zA-Z0-9_:.,/-]+来匹配示例文本Text [a,b]。尽管该模式适用于regex101,但是当我在scheme上运行它时,它会返回#f。这是regex101 link

这是我正在运行的功能

(string-match "[ \\[\\]a-zA-Z0-9_:.,/-]+" "Text [a,b]")

为什么它不能在方案上工作,而在其他地方工作?我想念什么吗?

2 个答案:

答案 0 :(得分:2)

我没有发现您的正则表达式语法有问题,因为正确引用了它,所以我认为Guile或它使用的regexp库中肯定有一个错误,其中\]不会被解释为括号内的正确方法。我发现使用八进制代码点值代替了解决方法:

(string-match "[A-Za-z\\[\\0135]+" "Text [a,b]")
; ==> #("Text [a,b]" (0 . 4))

您的正则表达式不是很好。它匹配这些字符的任何组合,因此"]/Te,3.xt[2"也匹配。如果您期望使用类似“某物[某物,某物]”的字符串,那么我宁愿使用/[A-Z][a-z0-9]+ [[a-z0-9]+,[a-z0-9]+]/。例如。

(define pattern "[A-Z][a-z0-9]+ \\[[a-z0-9]+,[a-z0-9]+\\]") 
(string-match pattern "Test [q,w]")     ; ==> #("Test [q,w]" (0 . 10))
(string-match pattern "Be100 [sub,45]") ; ==> #("Be100 [sub,45]" (0 . 14))

答案 1 :(得分:1)

在讨论了guile gnu邮件列表中的问题后,我发现Guile的(ice-9 regex)库使用POSIX扩展正则表达式。而且这种正则表达式不支持在字符类[..]中进行转义,因此这就是它与字符串不匹配的原因。

但是,我使用以下功能作为变通方法,并且可以正常工作:

(string-match "[][a-zA-Z]+" "Text[ab]")