首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修正正则表达式“[[a-Za-Z0-9_-]+]”

修正正则表达式“[[a-Za-Z0-9_-]+]”
EN

Stack Overflow用户
提问于 2020-04-29 21:55:23
回答 2查看 612关注 0票数 2

以下cl-ppcre正则表达式生成一个错误:

代码语言:javascript
复制
(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_-]+)]"

我所期望的返回值是:

代码语言:javascript
复制
“[has-instance]”
#(“has-instance”)

以获得括号内的字符串。有人能提供正则校正吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-29 23:02:43

转义字符(反斜杠)只转义,双引号(§2.4.5双引号):

如果看到单个转义字符,则丢弃单个转义字符,累积下一个字符,并继续积累。

这意味着:

代码语言:javascript
复制
 "\[([a-zA-Z0-9_-]+)]" 

在不存在反斜杠的情况下,解析如下:

代码语言:javascript
复制
 "[([a-zA-Z0-9_-]+)]"

closing实现的PCRE语法将开始方括号理解为字符类的特殊语法,并以下一个结束括号结束。因此,上面将下列内容作为一个类读取:

代码语言:javascript
复制
[([a-zA-Z0-9_-]

相应的regex树是:

代码语言:javascript
复制
CL-USER> (ppcre:parse-string "[([a-zA-Z0-9_-]")
(:CHAR-CLASS #\( #\[ (:RANGE #\a #\z) (:RANGE #\A #\Z) (:RANGE #\0 #\9) #\_ #\-)

特别要注意的是,它里面的括号是按字面处理的。当解析器遇到上述片段后面的结束括号时,它将其解释为寄存器组的结尾,但没有启动此类组,因此在字符串的位置16处出现错误消息。

为了避免将括号视为字符类,必须在字符串前面加上一个文字反斜杠,就像您试图做的那样,但要做到这一点,您必须编写两个反斜杠字符:

代码语言:javascript
复制
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术语:它避免了处理转义带来的问题。例如:

代码语言:javascript
复制
CL-USER> (ppcre:scan-to-strings 
           '(:sequence "[" (:register (:regex "[a-zA-Z0-9_-]+")) "]")
           "[has-instance]")
"[has-instance]"
#("has-instance")
票数 4
EN

Stack Overflow用户

发布于 2020-04-30 07:55:51

  1. 双转义方括号。
  2. 你也忘了(双倍)逃离关闭的括号。
代码语言:javascript
复制
(cl-ppcre:scan-to-strings "\\[([a-zA-Z0-9_-]+)\\]" "[has-instance]")
;; "[has-instance]" ;
;; #("has-instance")

对于那些刚接触普通lisp的人,您可以使用cl-ppcre导入:

代码语言:javascript
复制
(load "~/quicklisp/setup.list") ;; adjust path to where you installed your quicklisp
(ql:quickload :cl-ppcre)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61512420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档