2014-11-06 233 views
10

我試圖去使用負看看aheads:負向前看去正則表達式

以下正則表達式:BBB(((?!BBB).)*)EEE

http://rubular.com/r/Zw1vopp1MF

然而,在轉到我得到:

error parsing regexp: invalid or unsupported Perl syntax: `(?!` 

有沒有其他的選擇?

+0

你想要什麼樣的預期輸出? – hwnd 2014-11-06 04:35:25

+0

我想匹配BBB和EEE之間的所有內容。但是,如果有一個BBB的東西是BBB的東西,那麼其他的EEE。我只想匹配「BBB東西EEE」 – K2xL 2014-11-06 04:38:03

+0

如果你確信單獨的'B'或'BB'不存在,那麼你可以做的唯一事情是http://regex101.com/r/aM5oU3/4串。 – vks 2014-11-06 04:53:40

回答

3

根據您的示例和您的預期輸出,以下內容將起作用。

re := regexp.MustCompile(`BBB([^B]*)EEE`) 

GoPlay

+1

似乎這會失敗的東西,如:BBB xx B xx EEE' – femtoRgon 2014-11-08 00:14:30

+1

這可能是一個解決方案,但一個不同的問題。這個問題是關於負面看法。 – 2015-07-01 14:14:21

+1

是的,不支持。 – hwnd 2015-07-01 14:43:38

10

排除模式不支持技術上的原因,特別是因爲它與O(N)的圖書館 - 時間保證衝突。關於此,請參閱golang-nuts group discussion以及Regular Expression Matching in the Wild中的注意事項部分。

你可以表達你不排除模式已經描述了正則表達式:

BBB([^B]|B[^B]|BB[^B])*EEE 

下面是一個example證明:

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 
    re := regexp.MustCompile(`BBB([^B]|B[^B]|BB[^B])*EEE`) 
    fmt.Printf("%#v\n", re.FindAllString("BBB EEE BBB..BBB...EEE", -1)) 
} 
+0

@ hwnd的解決方案更簡單。我假設,當你說'BBB'時,你並不真正的意思是'BBB',而是一些任意的開始字符序列,然後是一系列結束字符。但也許你正在尋找''「BBB」'和''EEE「'。 :P – dyoo 2014-11-07 01:08:26

0

dlclark/regexp2是.NET框架的System.Text.RegularExpressions.Regex引擎的端口。

.NET字符串和Go字符串之間存在一些根本區別,它們需要從Go框架正則表達式引擎中借用一些內容。我在端口期間清理了一些較髒的位(regexcharclass.cs非常糟糕),但是分析樹,代碼被省略,因此匹配的模式應該是相同的。

它的名稱中去掉在lengthy discussion about O(n) regular expressions結束,並caveated:

然而,由於有不受更全功能提供給基於RE2引擎的好處我想提醒慎用引擎與周圍。如果你有選擇,然後堅持stdlib。

功能的成本是一個較慢的實施。