2012-08-14 73 views
11

我想匹配以給定單詞開頭的所有行,比如iheap。如果我沒有弄錯,那麼正則表達式(在ECMAScript語法中)"^iheap.*"應該做到這一點。但是,當我使用libC++的正則表達式庫在C++ 11中測試時,只匹配第一行。所以"^..."似乎只匹配輸入的開始,而不是開始行。使用libC++正則表達式庫(C++ 11)匹配「開始行」

下面是一個例子:

#include <string> 
#include <regex> 
#include <iostream> 

using namespace std; 

int main() { 
     regex rx("^iheap.*"); 
     string s = "iheap says hello.\niheap says hello again.\n"; 
     cout << s << regex_replace(s, rx, "IHEAP"); 
     return 0; 
} 

輸出:

iheap says hello. 
iheap says hello again. 
IHEAP 
iheap says hello again. 

這是的libC++中的錯誤還是我做錯了什麼?謝謝!

注意:我使用的是Mac OS X Mountain Lion和Apple LLVM Compiler 4.0(基本上是ng 3.1 SVN的快照)。

+0

只是偶然發現了這個問題...... fyi,boost :: regex(在EMCAScript模式下)匹配行首,即你的正則表達式可以工作。 – fscan 2013-06-29 20:08:31

+0

Hrmm,只是略有相關,但'$'與VS2013中的'\ r \ n'不匹配 - 需要'\ s * $'或類似的匹配... – Cameron 2014-04-23 16:41:39

回答

5

我已經查看了所有相關標準,並且據我所知,^只匹配字符串的開頭,而不是換行符,除非引擎處於多行模式。默認引擎是ECMA-262引擎默認情況下不處於多行模式,我無法使用std C++接口將其放入多行模式。所有的說法,如果有人可以指向我說的不同的規範性文本,我會認爲這是一個錯誤報告,並盡我所能來解決這個問題。

+1

只是爲了一個傻笑,試試這個: '(M +)^ IHEAP。*'。 ECMA-262沒有指定內聯修飾符,但是'libC++'無論如何都可以支持它們。這不會是唯一的ECMAScript正則表達式實現來單方面添加對規範中未涉及的功能的支持。 – 2012-08-15 02:13:00

+0

@AlanMoore:剛試過,拋出異常。不幸的是,他們似乎不支持該擴展。 – iheap 2012-08-15 15:27:01

+2

你好,霍華德。我也找不到解決問題的規範性文本,但我認爲我有足夠的理由暗示默認模式應該是多行的。有'std :: regex_constants :: match_not_bol'標誌,其功能是確保''^「'斷言與輸入的開頭不匹配。在多線模式下使用該標誌; ''^「'斷言將匹配除第一行之外的所有行。在單線模式下,該標誌會使''^「斷言失去功能,這對我來說沒有意義。 – iheap 2012-08-15 15:34:58