尝试解析以下文本文件:
prefix1 prefix2 name1(
type1 name1,
type2 name2
);
Run Code Online (Sandbox Code Playgroud)
使用以下正则表达式:
\\s*prefix1\\s*prefix2\\s*(\\w[\\w\\d_]*).*\\(\\s*([^\\)]*\\))\\s*;\\s*
结果,我得到以下两个组(寄存器):
"name1(
"
Run Code Online (Sandbox Code Playgroud)
和
"(
type1 name1,
type2 name2
)"
Run Code Online (Sandbox Code Playgroud)
(此处引号限制字符串,包括\ n)
我不明白为什么第一组(\w[\w\d_]*)与下.*一部分匹配。而且,我不能摆脱不必要的尾巴!
我怎么了
添加:解析的正则表达式:
(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) #\; …Run Code Online (Sandbox Code Playgroud) 我一定在这里缺少一些非常基本的东西。
我需要从常见Lisp中的匹配项中提取捕获组。当我评估解释器(sbcl实现)时:
`(cl-ppcre::scan-to-strings ".*?(\\d).png" "sample1.png")`
Run Code Online (Sandbox Code Playgroud)
我得到:
"sample1.png"
#("1")
Run Code Online (Sandbox Code Playgroud)
但是,如果我将该表达式绑定到一个值,请说
`(setq number (cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))`
Run Code Online (Sandbox Code Playgroud)
number的值变为"sample1.png"。如何获得"1"打印的?
可能这个问题真的很糟糕,但我被困住了.如何cl-ppcre:regex-replace-all更换反斜杠?
例如,我只想逃避一些字符,比如'"()等,所以我首先要用|替换,看看匹配是否正常:
CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "|\\1"))
PRINTED: foo |"bar|" |'baz|' |(test|)
Run Code Online (Sandbox Code Playgroud)
好的,我们把斜线:
CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\1"))
PRINTED: foo "bar" 'baz' (test) ;; No luck
Run Code Online (Sandbox Code Playgroud)
不,我们有两个斜线:
CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\\1"))
PRINTED: foo \1bar\1 \1baz\1 \1test\1 ;; Got slash, but not \1
Run Code Online (Sandbox Code Playgroud)
也许是这样的?
(princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\{1}"))
PRINTED: foo "bar" 'baz' (test) ;; Nope, no luck here
Run Code Online (Sandbox Code Playgroud)
当然,如果我在斜线之间放置空间就可以了,但我不需要它
(princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])" …Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的正则表达式,在我的Ruby代码中运行得非常好,但拒绝使用我的Lisp代码.我只是想匹配一个URL(斜杠后跟一个单词,而不是更多).这是我在Ruby中使用的正则表达式:^\/\w*$
我希望这与匹配"/"或"/foo"不匹配"/foo/bar"
我尝试过以下方法:
(cl-ppcre:scan "^/\w*$" "/") ;works
(cl-ppcre:scan "^/\w*$" "/foo") ;doesn't work!
(cl-ppcre:scan "^/\w*$" "/foo/bar") ;works, ie doesn't match
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?