我想从特殊前缀中挑选句子:
(re-find (re-pattern (str "(?<=" "\+" "+:=)" ".+")) "++:= test test")
=> " test test"
我尝试删除test test
头部的空格。所以我把它改成:
(re-find (re-pattern (str "(?<=" "\+" "+:=\s*)" ".+")) "++:= test test")
=>nil
但是这段代码有效:
(re-find (re-pattern (str "(?<=" "\+" "+:=\s)" ".+")) "++:= test test")
=> "test test"
实际上,test test
之前不仅有一个空格(也许也没有(,我不知道为什么\s
工作得很好,但\s*
没有。
此代码中会发生什么?我该如何解决它?
编辑:
如果你有一个幸运的引擎可以进行可变宽度的回溯
,你可以通过使用(?<=++:=s*)(?!s).+
来坚持负前瞻
来强制它工作
对于其他发动机:
s*
可以匹配可变数量的空格。++
可以匹配可变数量的加号。
在除 Dot-Net 正则表达式引擎之外的所有引擎中,不允许在后视断言中使用可变宽度。
所以这个(?<=++:=s*)
会抛出一个错误,即不会编译。
我不确定你说的don't work
是什么意思...
解决此问题的正常方法是捕获您需要的内容,然后引用它。++:=s*(.+)
** Grp 0 - ( pos 0 , len 14 )
++:= test test
** Grp 1 - ( pos 5 , len 9 )
test test