yxp 发表于 2013-7-22 23:12:15

lisp如何检查正则表达式的语法错误?

本帖最后由 yxp 于 2013-7-22 23:15 编辑

当正则表达式为一个元字符 "*" 时,文本搜索产生一个 “错误,发生意外。”
程序在设计过程中是可测试并避免的,
但在使用过程中,由用户输入的错误表达式,将导致程序非正常退出,
用 *error* 无法返回这个错误。

例如: (sFind "abcdef" "*" "gp")

(defun sFind(Source Regex Key / vbRegEx sLt ss *error*)
(defun *error* (msg)(princ msg)) ;;正则表达式的语法出错好像无法捕获
(setq vbRegEx (vlax-create-object "Vbscript.RegExp")) ;;创建正则表达式引用
(foreach x '(("Global" . "*g*,*G*")      ;;设置全文检索还是只检索出现的第一处,0为只检查第一处,1为全文检索
               ("IgnoreCase" . "*i*,*I*");;忽略大小写,0为区分大小写,1为忽略大小写
               ("Multiline" . "*m*,*M*"))   ;;多行模式单行模式 "Singleline" 好像不顶用
    (vlax-put-property vbRegEx (car x) (if (and Key (wcmatch Key (cdr x))) 1 0))
)
(setq ss (if (and Key (wcmatch Key "*p*,*P*")) "FirstIndex" "value")) ;;key中含参数p为返回查找位置
(vlax-put-property vbRegEx "Pattern" Regex)
(vlax-for obj (vlax-invoke vbRegEx 'Execute Source)
    (setq sLt (cons (vlax-get-property obj ss) sLt)))
    (vlax-release-object vbRegEx)
(reverse sLt)
)

yxp 发表于 2013-7-22 23:34:49

本帖最后由 yxp 于 2013-7-23 00:07 编辑

问题解决:
(defun sFind(Source Regex Key / vbRegEx sLt ss err)
(setq vbRegEx (vlax-create-object "Vbscript.RegExp")) ;;创建正则表达式的Active对象引用
(foreach x '(("Global" . "*g*,*G*")      ;;设置全文检索还是只检索出现的第一处,0为只检查第一处,1为全文检索
               ("IgnoreCase" . "*i*,*I*");;忽略大小写,0为区分大小写,1为忽略大小写
               ("Multiline" . "*m*,*M*"))   ;;多行模式单行模式 "Singleline" 好像不顶用
    (vlax-put-property vbRegEx (car x) (if (and Key (wcmatch Key (cdr x))) 1 0))
)
(setq ss (if (and Key (wcmatch Key "*p*,*P*")) "FirstIndex" "value")) ;;p参数为返回位置
(vlax-put-property vbRegEx "Pattern" Regex)
(setq err (vl-catch-all-apply 'vlax-invoke (list vbRegEx 'Execute Source)))
(cond ((null (vl-catch-all-error-p err))
          (vlax-for obj err (setq sLt (cons (vlax-get-property obj ss) sLt)))
          (vlax-release-object vbRegEx)
          (reverse sLt)
      )
      (t (princ "正则表达式错误")(princ))
)
)

yxp 发表于 2013-7-23 16:48:09

在明经中下载的《正则表达式经典实例. (美)高瓦特斯 ...》.pdf 中说
正则表达式的流派 .NET、Java、JavaScript、PCRE、Perl、Python、Ruby

Vbscript.RegExp是VB家族的应该属于 .net 流派吧,但是书中的实例几乎大部分都无法使用...有试过的吗?

13648893846 发表于 2018-5-12 20:29:39

学习学习院长的高招
页: [1]
查看完整版本: lisp如何检查正则表达式的语法错误?