【发布时间】:2013-01-15 18:05:31
【问题描述】:
我一直在尝试让一个简单的 reg-ex 在 Clojure 中工作,以测试字符串中的一些 SQL 保留字(select、from、where 等),但无法让它工作:
(defn areserved? [c]
(re-find #"select|from|where|order by|group by" c))
(我用空格分割一个字符串,然后遍历所有单词)
非常感谢您的帮助,
谢谢!
编辑:我的第一个目标(在仅阅读了一些示例和基本 Clojure 材料之后)是解析一个字符串并为它的每个部分(即单词)返回他们在语句(保留字、字符串等)。
到目前为止我所拥有的:
(use '[clojure.string :only (join split)])
(defn isdigit? [c]
(re-find #"[0-9]" c))
(defn isletter? [c]
(re-find #"[a-zA-Z]" c))
(defn issymbol? [c]
(re-find #"[\(\)\[\]!\.+-><=\?*]" c))
(defn isstring? [c]
(re-find #"[\"']" c))
(defn areserved? [c]
(if (re-find #"select|from|where|order by|group by" c)
true
false))
(defn what-is [token]
(let [c (subs token 0 1)]
(cond
(isletter? c) :word
(areserved? c) :reserved
(isdigit? c) :number
(issymbol? c) :symbol
(isstring? c) :string)))
(defn checkr [token]
{:token token
:type (what-is token)})
(defn goparse [sql-str]
(map checkr (.split sql-str " ")))
感谢大家的帮助!很高兴看到对这种相对较新的语言有如此多的支持(至少对我来说:))
【问题讨论】:
-
如果你用空格分割,那么在你的模式中包含“order by”和“group by”是没有意义的。
-
您能否更详细地说明它是如何不起作用的?如果您的函数匹配得太急切(例如
(areserved? "whereto"),您可能希望使用re-matches。或者如果它过于区分大小写(例如(areserved? "WHERE")),您可能需要将(?i:...)包裹在您的正则表达式组周围。在任何阅读 Clojure regex 和 java.util.regex.Pattern 的文档的案例会有所帮助。
标签: clojure