以下cl-ppcre正则表达式生成一个错误:
(ppcre:scan-to-strings "\[([a-zA-Z0-9_-]+)]" "[has-instance]")
debugger invoked on a CL-PPCRE:PPCRE-SYNTAX-ERROR in thread
#<THREAD "main thread" RUNNING {10010B0523}>:
Expected end of string. at position 16 in string "[([a-zA-Z0-9_-]+)]"我所期望的返回值是:
“[has-instance]”
#(“has-instance”)以获得括号内的字符串。有人能提供正则校正吗?谢谢。
发布于 2020-04-29 23:02:43
转义字符(反斜杠)只转义,双引号(§2.4.5双引号):
如果看到单个转义字符,则丢弃单个转义字符,累积下一个字符,并继续积累。
这意味着:
"\[([a-zA-Z0-9_-]+)]" 在不存在反斜杠的情况下,解析如下:
"[([a-zA-Z0-9_-]+)]"closing实现的PCRE语法将开始方括号理解为字符类的特殊语法,并以下一个结束括号结束。因此,上面将下列内容作为一个类读取:
[([a-zA-Z0-9_-]相应的regex树是:
CL-USER> (ppcre:parse-string "[([a-zA-Z0-9_-]")
(:CHAR-CLASS #\( #\[ (:RANGE #\a #\z) (:RANGE #\A #\Z) (:RANGE #\0 #\9) #\_ #\-)特别要注意的是,它里面的括号是按字面处理的。当解析器遇到上述片段后面的结束括号时,它将其解释为寄存器组的结尾,但没有启动此类组,因此在字符串的位置16处出现错误消息。
为了避免将括号视为字符类,必须在字符串前面加上一个文字反斜杠,就像您试图做的那样,但要做到这一点,您必须编写两个反斜杠字符:
CL-USER> (ppcre:parse-string "\\[([a-zA-Z0-9_-]+)]")
(:SEQUENCE #\[
(:REGISTER
(:GREEDY-REPETITION 1 NIL
(:CHAR-CLASS (:RANGE #\a #\z) (:RANGE #\A #\Z) (:RANGE #\0 #\9) #\_ #\-)))
#\])结束方括号不需要反斜杠。
我鼓励您使用树表单在Lisp中编写正则表达式,在提高清晰度时使用:regex术语:它避免了处理转义带来的问题。例如:
CL-USER> (ppcre:scan-to-strings
'(:sequence "[" (:register (:regex "[a-zA-Z0-9_-]+")) "]")
"[has-instance]")
"[has-instance]"
#("has-instance")发布于 2020-04-30 07:55:51
(cl-ppcre:scan-to-strings "\\[([a-zA-Z0-9_-]+)\\]" "[has-instance]")
;; "[has-instance]" ;
;; #("has-instance")对于那些刚接触普通lisp的人,您可以使用cl-ppcre导入:
(load "~/quicklisp/setup.list") ;; adjust path to where you installed your quicklisp
(ql:quickload :cl-ppcre)https://stackoverflow.com/questions/61512420
复制相似问题