我正在使用模式[ []a-zA-Z0-9_:.,/-]+
运行string-match
以匹配示例文本Text [a,b]
。尽管该模式适用于正则表达式 101,但当我在方案上运行它时,它会返回 #f
.这是正则表达式101链接。
这是我正在运行的功能
(string-match "[ \[\]a-zA-Z0-9_:.,/-]+" "Text [a,b]")
为什么它不是在计划上工作,而是在任何地方工作?我错过了什么吗?
在 guile gnu 邮件列表中讨论了这个问题之后,我发现 Guile 的(ice-9 regex)
库使用了 POSIX 扩展正则表达式。而且这种正则表达式不支持在字符类[..]
转义,因此这就是为什么它不匹配字符串的原因。
但是,我使用以下函数作为解决方法,它可以工作:
(string-match "[][a-zA-Z]+" "Text[ab]")
我认为您的正则表达式语法没有任何问题,因为它被正确引用,因此我认为 Guile 或其使用的正则表达式库中一定存在错误,其中]
只是没有在括号内以正确的方式解释。我通过使用八进制代码点值找到了解决方法:
(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))