我正在使用string-match
模式运行[ \[\]a-zA-Z0-9_:.,/-]+
来匹配示例文本Text [a,b]
。尽管该模式适用于regex101,但是当我在scheme上运行它时,它会返回#f
。这是regex101 link。
这是我正在运行的功能
(string-match "[ \\[\\]a-zA-Z0-9_:.,/-]+" "Text [a,b]")
为什么它不能在方案上工作,而在其他地方工作?我想念什么吗?
答案 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]")