【问题标题】:Racket regular-expression matching球拍正则表达式匹配
【发布时间】:2010-05-22 16:57:23
【问题描述】:

我正在尝试创建一个匹配某个字符串类型的逆的正则表达式(例如,字符串不以“.js”结尾)。

根据文档,这应该是表达式#rx"(?!\\.js$)",但它似乎不起作用。为了测试它,我有这个功能:

(定义(匹配测试正则表达式) (地图(lambda(文本) (正则表达式匹配?正则表达式文本)) '("foo.js" "bar.css" "baz.html" "mumble.gif" "foobar")))

(match-test #rx"\\.js$") 按预期返回(#t #f #f #f #f),但(match-test #rx"(?!\\.js$)") 返回(#t #t #t #t #t),我期望(#f #t #t #t #t)

我做错了什么,如何在 Racket 中获得一个正则表达式来表达“匹配任何不包含 [x] 的内容”的想法?

【问题讨论】:

  • 附录:如果有人有足够的代表,你可能想创建一个“球拍”或“球拍方案”标签。目前还没有,PLT 计划的人正在尝试更改他们的项目名称。
  • 我为你添加了标签。
  • 有什么特别的原因你不能仅仅(映射而不是'这个函数的结果)得到否定吗?或者这更像是一个“我想了解为什么这不起作用”的问题?
  • 是的;我使用它来初始化 Racket Server 的特定位置。它有一个名为“servlet-regexp”的属性,它采用正则表达式来确定将调度应用到哪些 URI。如果该属性可以采用返回布尔值而不是正则表达式的函数,我会使用您建议的方法。

标签: regex scheme racket


【解决方案1】:

您需要锚定否定匹配,否则它可以成功匹配(如果您愿意,也可以成功不匹配)字符串中的任何位置。您可以将正则表达式锚定到字符串的末尾,并使用否定的lookbehind 来检查最后几个字符。我不熟悉 Scheme 语法,但我想你可以使用这个:

#rx"(?<!\\.js)$"

以及如何在 Racket 中实际使用正则表达式来表达“匹配任何不包含 [x] 的内容”的想法

这有点棘手。您可以对字符串中的每个字符使用负前瞻。以下是如何在任何地方匹配不包含 foo 的字符串。如果这在 Scheme 中不能很好地工作,再次道歉,但它应该证明这个想法:

#rx"^((?!foo).)*$"

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2023-03-21
    • 2019-03-30
    • 2011-05-01
    相关资源
    最近更新 更多