3

我有来自数据库的一串数据

[context]=[context desc].[context level].&[data]

我写了一个正则表达式来查找看起来像这样的数据部分

(.* [.&;^])(?:[^*])([^]]+)

这将返回三个组,但我只想要最后一个。我如何获得最后一组?

编辑

抱歉应该更清楚我的输出(re-seq #"(.*[.&;^])(?:[^*])([^]]+)" line)是:

(["[context]=[context desc].[context level].&[data" "[context]=[context desc].[context level].&" "data"])

我想要的只是[“数据”]

4

3 回答 3

3

要回答原始问题:

单个匹配re-seq项以向量的形式返回,完整匹配项是向量的第一项,组是其他元素,按顺序。您可以使用peek来获取向量的最终元素(以特别快的方式):

(def s "[context]=[context desc].[context level].&[data]")
(def r #"(.*[.&;^])(?:[^*])([^]]+)") ; tweaked to remove a space

(map peek (re-seq r s))
;= ("data")

选择不同的正则表达式可能仍然是一个好主意。例如,如果最终的[data]子字符串确实出现在输入字符串的末尾并且它不包含任何[字符,则可以使用#"[^\[]+(?=\]$)"

(re-seq #"[^\[]+(?=\]$)" s)
;= ("data")
于 2013-07-08T14:51:50.883 回答
0
(.* [.&;^])(?:[^*])([^]]+)$

使用 $ 表示匹配正则表达式的字符串的结尾。

编辑由于您没有提供匹配的字符串的完整示例,因此字符串的结尾可能不会出现在最后一个匹配组之后,在这种情况下,您需要使用否定前瞻在 $ 之前确保没有更多可捕获的数据。

于 2013-07-08T13:53:27.683 回答
0

也许尝试更简单的正则表达式:

(def s "[context]=[context desc].[context level].&[data]")

user> (re-find #"\.&(.+)" s)
[".&[data]" "[data]"]

user> (last (re-find #"\.&(.+)" s))
"[data]"
于 2013-07-08T14:06:40.057 回答