【问题标题】:Regex not matching string in scheme but works on other platform正则表达式与方案中的字符串不匹配,但适用于其他平台
【发布时间】:2019-10-29 19:24:41
【问题描述】:

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

这是我正在运行的函数

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

为什么它不能在方案上工作,但在其他地方工作?我错过了什么吗?

【问题讨论】:

    标签: scheme guile


    【解决方案1】:

    我认为您的正则表达式语法没有任何问题,因为它被正确引用,所以我认为 Guile 或它使用的正则表达式库中一定存在错误,其中 \] 没有被正确解释括号内。我通过使用八进制代码点值找到了一种解决方法:

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

    你的正则表达式不是很好。它匹配这些字符的任何组合,因此 "]/Te,3.xt[2" 也匹配。如果你期待一个像“Something [something, something]”这样的字符串,我宁愿使用/[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))
    

    【讨论】:

    • 运行(match:substring (string-match "[ A-Za-z\\[\\0135]+" "Text [a,b]")) 返回Text [a,b,但仍与] 不匹配。另外,因为我正在尝试匹配长化学名称,所以字符的顺序并不重要
    【解决方案2】:

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

    但是,我使用以下函数作为解决方法,并且它有效:

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

    【讨论】:

      猜你喜欢
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多