我試圖使用向後看檢查前面的元素是一個空間或字符串開頭:升壓/ Perl的正則表達式向後看含OR
(?<=^|\s)
這工作得很好,在regex101
與味道設爲PHP
但在boost
(我相信是Perl
)下給出語法錯誤。我認爲它的^
引起了這個問題。我無法找到任何文件,爲什麼這將是非常感謝的見解。
我試圖使用向後看檢查前面的元素是一個空間或字符串開頭:升壓/ Perl的正則表達式向後看含OR
(?<=^|\s)
這工作得很好,在regex101
與味道設爲PHP
但在boost
(我相信是Perl
)下給出語法錯誤。我認爲它的^
引起了這個問題。我無法找到任何文件,爲什麼這將是非常感謝的見解。
您應該能夠使用|
在lookbehinds升壓,與每一個替代方案必須具有相同的(固定)長度的限制。
^
是斷言,因此長度爲0\s
匹配的一個字符,所以它的長度爲1。PCRE鬆開此限制:單替代仍必須固定長度,但他們現在不一定需要等長。
下面是在PCRE docs相關線:
的(a)雖然在PCRE2向後斷言必須匹配固定長度字符串,一個每個向後斷言的選擇分支可以匹配不同長度的字符串。 Perl要求它們都具有相同的長度。
事實上,Perl將輸出下面的錯誤,如果你嘗試:
$ perl -e 'm#(?<=^|\s)#' Variable length lookbehind not implemented in regex m/(?<=^|\s)/ at -e line 1.
現在,作爲解決方案,你需要找到一個解決辦法。我將在這裏引用Casimit et Hippolyte's comment:
作爲一種很好的解決方法,可以使用
(?<!\S)
來處理這兩種情況。對於更復雜的情況,沒有什麼是禁止寫的(?:(?<=sub1)|(?<=sub2)|...)
感謝所有的信息 –
您的問題對我來說還不清楚,請提供一些樣品和預期結果-HTH;)。 –
可能相關的問題是:[爲什麼Java和Perl中的正則表達式的行爲不同?](https://stackoverflow.com/q/784267/4519059);)。 –
libboost支持多種正則表達式,您確定要選擇好的嗎?無論如何,libpcre和libboost兼容的正則表達式風格(像這樣)之間有很小的差異。另外一個好的解決方法可以是處理這兩種情況的'(?<!\ S)'。對於更復雜的情況,禁止寫'(?:(?<= sub1)|(?<= sub2)| ...)' –