Clojure 正则表达式删除 (?<=) 模式中的空格



我想从特殊前缀中挑选句子:

(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  

最新更新