2017-09-03 59 views
1

我試圖使用向後看檢查前面的元素是一個空間或字符串開頭:升壓/ Perl的正則表達式向後看含OR

(?<=^|\s) 

這工作得很好,在regex101與味道設爲PHP但在boost(我相信是Perl)下給出語法錯誤。我認爲它的^引起了這個問題。我無法找到任何文件,爲什麼這將是非常感謝的見解。

+0

您的問題對我來說還不清楚,請提供一些樣品和預期結果-HTH;)。 –

+0

可能相關的問題是:[爲什麼Java和Perl中的正則表達式的行爲不同?](https://stackoverflow.com/q/784267/4519059);)。 –

+1

libboost支持多種正則表達式,您確定要選擇好的嗎?無論如何,libpcre和libboost兼容的正則表達式風格(像這樣)之間有很小的差異。另外一個好的解決方法可以是處理這兩種情況的'(?<!\ S)'。對於更復雜的情況,禁止寫'(?:(?<= sub1)|(?<= sub2)| ...)' –

回答

0

應該能夠使用|在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)|...)

+0

感謝所有的信息 –