2012-10-12 41 views
2

我期待執行其中一個串(條)不受任何兩個字符串(富)或(BOO)立即preceeded搜索如何在C++中使用或模仿lookbehind斷言?

例如

foo=bar不應與

foo=baz bar應該匹配

bar應符合

boo=bar不應該匹配

我認爲正則表達式背後的觀點對此來說是完美的。但是,當我嘗試使用MSVC++的(?<!作爲後面的外觀時,出現未處理的異常

是否支持斷言?它在語法上有所不同嗎?或者有人可以幫我寫這個正則表達式或模擬行爲?

+0

如果看後面是可用的,你會如何編寫正則表達式?我只是不確定你的定義,所以我想看看你會怎麼做。 – nhahtdh

回答

2

看看使用Boost.Regex或Boost.Xpressive。 MSVC++ 10的正則表達式實現不完整,而Boost(對於Regex和Xpressive)都是。兩者都有其優點和缺點。

而xpressive中更快,因爲編譯時正則表達式編譯和正則表達式提供更好的語法檢查,也容易產生一個很多符號,讓你看的增加調試信息,最低幾兆。

正則表達式速度快,不需要表達式使用正則表達式構造的運算符。但是,它確實需要在庫中進行鏈接。

還有其他C++正則表達式引擎可以執行perl正則表達式,但是使用Boost非常無痛,而且我沒有遇到任何問題,無論我在扔什麼東西。

+0

perl正則表達式引擎支持lookbehinds? PHP中的AFAIR PCRE不支持無限後視。 –

+0

正則表達式和Xpressive支持向後看,但我不確定每個的限制是什麼。 boost-users郵件列表可能會幫助你。 – moshbear

1

沒有太多的正則表達式支持無限的lookbehind,但它們都支持無限的lookahead。

您可以反轉該字符串,使用向前並再次反向。但是,這對於大型琴絃而言是昂貴的。

您可能能夠使用有界倒序。一些正則表達式風格支持向後看,如果他們知道它的確切或最大長度。

您可能會發現整個字符串沒有後視,然後手動丟棄一些匹配。如果重疊不是問題,您可以將後臺更改爲可選捕獲組,然後丟棄捕獲組匹配的匹配項。在替換積極向後看時,可選捕獲組不需要是可選的,也不需要捕獲(也不是組)。