首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用匹配错误吗?

使用匹配错误吗?
EN

Stack Overflow用户
提问于 2013-06-11 09:14:26
回答 1查看 712关注 0票数 5

试图解析以下文本文件:

代码语言:javascript
复制
prefix1 prefix2 name1(
                 type1 name1,
                 type2 name2
                 );

有以下指标:

\\s*prefix1\\s*prefix2\\s*(\\w[\\w\\d_]*).*\\(\\s*([^\\)]*\\))\\s*;\\s*

因此,我得到了以下两个组(寄存器):

代码语言:javascript
复制
"name1(
             "

代码语言:javascript
复制
"(
             type1 name1,
             type2 name2
             )"

(这里的引号限制字符串,\n包括在内)

我不明白为什么第一个组(\w[\w\d_]*)与下面的.*部件匹配。而且,我不能摆脱不必要的尾巴!

我犯了什么错?

ADD:解析正则表达式:

代码语言:javascript
复制
(cl-ppcre::parse-string "\\s*prefix1\\s*prefix2\\s*(\\w[\\w\\d_]*).*\\(\\s*([^\\)]*\\))\\s*;\\s*")
(:SEQUENCE (:GREEDY-REPETITION 0 NIL :WHITESPACE-CHAR-CLASS) "prefix1"
 (:GREEDY-REPETITION 0 NIL :WHITESPACE-CHAR-CLASS) "prefix2"
 (:GREEDY-REPETITION 0 NIL :WHITESPACE-CHAR-CLASS)
 (:REGISTER
  (:SEQUENCE :WORD-CHAR-CLASS
   (:GREEDY-REPETITION 0 NIL (:CHAR-CLASS :WORD-CHAR-CLASS :DIGIT-CLASS #\_))))
 (:GREEDY-REPETITION 0 NIL :EVERYTHING) #\(
 (:GREEDY-REPETITION 0 NIL :WHITESPACE-CHAR-CLASS)
 (:REGISTER
  (:SEQUENCE (:GREEDY-REPETITION 0 NIL (:INVERTED-CHAR-CLASS #\))) #\)))
 (:GREEDY-REPETITION 0 NIL :WHITESPACE-CHAR-CLASS) #\;
 (:GREEDY-REPETITION 0 NIL :WHITESPACE-CHAR-CLASS))

ADD 2:完整的源代码:

代码语言:javascript
复制
;; Requirements:
;; cl-ppcre

(defparameter *name-and-parameters-list* (cl-ppcre::create-scanner "\\s*prefix1\\s*prefix2\\s*(\\w[\\w\\d_]*)\\s*\\(\\s*([^\\)]*\\))\\s*;\\s*"))
(defparameter *filename* "c:/pva/home/test.txt")

(defun read-txt-without-comments (file-name)
  "Would epically fail in case the file format changes, because currently it expects
 the \"/*\" and \"*/\" sequences to be on the separate line."
  (let ((fstr (make-array '(0) :element-type 'base-char :fill-pointer 0 :adjustable t)))
    (with-output-to-string (s fstr)
      (let ((comment nil))
    (with-open-file (input-stream file-name :direction :input)
      (do ((line (read-line input-stream nil 'eof) (read-line input-stream nil 'eof)))
          ((eql line 'eof))
        (multiple-value-bind (start-comment-from)
        (cl-ppcre:scan ".*/\\*" line)
          (multiple-value-bind (end-comment-from)
          (cl-ppcre:scan ".*\\*/" line)
        (if start-comment-from
            (setf comment t))
        (if (not comment)
            (format s "~A~%" line))
        (if end-comment-from
            (setf comment nil))))))))
    fstr))

(let* ((string (read-txt-without-comments "c:/pva/home/test.txt")))
  (multiple-value-bind (a b c d) (cl-ppcre::scan *name-and-parameters-list* string)
    (format t "~a ~a ~a ~a~%|~a|~%|~a|~%"
        a b c d
        (subseq string (svref c 0) (svref c 1))
        (subseq string (svref d 0) (svref d 1)))))

ADD 3:完整的输入:

代码语言:javascript
复制
prefix1 prefix2 name1(
                 type1 name1,
                 type2 name2
                 );
prefix1 prefix2 name2(  type3 name1, type2 name2  );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-11 09:48:50

这适用于我最近的cl-ppcre,正如您所期望的那样:

代码语言:javascript
复制
(cl-ppcre:register-groups-bind (name argument)
             ("\\s*prefix1\\s*prefix2\\s*(\\w[\\w\\d_]*).*\\(\\s*([^\\)]*\\))\\s*;\\s*"
              "prefix1 prefix2 name1(
                 type1 name1,
                 type2 name2
                 );" :sharedp t)
           (list name argument))
("name1" "type1 name1,
                 type2 name2
                 )")

也许,多显示一点代码?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17040456

复制
相关文章

相似问题

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