如果您对正则表达式有疑问,也可以使用以下方法进行检查ppcre:parse-string
:
CL-USER> (ppcre:parse-string "^/\w*$")
(:SEQUENCE :START-ANCHOR #\/ (:GREEDY-REPETITION 0 NIL #\w) :END-ANCHOR)
上面告诉我们反斜杠 -w
被解释为文字w
字符。
将此与您要使用的表达式进行比较:
CL-USER> (ppcre:parse-string "^/\\w*$")
(:SEQUENCE :START-ANCHOR #\/ (:GREEDY-REPETITION 0 NIL :WORD-CHAR-CLASS) :END-ANCHOR)
返回值是表示正则表达式的树。事实上,您可以在任何 CL-PPCRE 需要正则表达式的地方使用相同的表示。尽管它有点冗长,但这有助于将值组合到正则表达式中,而不必担心在字符串中嵌套字符串或特殊字符:
(defun maybe (regex)
`(:greedy-repetition 0 1 ,regex))
(defparameter *simple-floats*
(let ((digits '(:register (:greedy-repetition 1 nil :digit-class))))
(ppcre:create-scanner `(:sequence
(:register (:regex "[+-]?"))
,digits
,(maybe `(:sequence "." ,digits))))))
在上面,点"."
是按字面意思阅读的,而不是正则表达式。这意味着您可以使用纯字符串正则表达式中的转义字符匹配类似"(^.^)"
或"[]"
难以写入和读取的字符串。您可以使用表达式回退到作为字符串的正则(:regex "...")
表达式。
CL-PPCRE 有一个优化,其中常量正则表达式在加载时使用load-time-value
. 如果您的正则表达式不是普通常量,则可能不会应用该优化,因此您可能希望将自己的扫描仪包装在load-time-value
表单中。只需确保您在加载时准备好足够的定义,例如辅助maybe
功能。