2015-11-26 22 views
2

我想從單個文件中提取多個GLSL源文件,並使用標題分隔。我寫這個正則表達式,爲我做到這一點:Visual C++正則表達式行爲vs gcc

(?:\n|^)-- (\w*)\.?(\d\d\d)?\.(\w\w\w?)\r?\n([\s\S\r\n]*?)(?=\n--|$) 

運行在這樣一個來源:

-- passthrough.VS 
in vec4 position; 

void main(){ 
    gl_Position = position; 
} 

-- mvp.VS 
layout (location=0) in vec3 position; 

uniform mat4 model; 
#include "engine/shaders/vp_include.glsl" 

void main() { 
    gl_Position = proj * view * model * vec4 (position, 1.0); 
} 

捕獲組([\s\S\r\n]*?)應該符合着色器的主體。由於Regex Working on regexr but not Visual Studio,我包含\r\n

預期的輸出(以及要運行的代碼)在這裏:http://coliru.stacked-crooked.com/a/a890795f0c438a0b,使用gcc編譯(regex101.com的引擎也提供了預期的輸出)。

我的問題是與Visual Studio 2015,這最後捕獲簡單地匹配一個空字符串(其他捕獲工作)。

我錯過了什麼嗎?這是VS正則表達式實現中的錯誤嗎?

+0

您可能需要在C認爲特殊的事情上轉義反斜槓。因此,一個將\ r \ n放入C字符串的正則表達式會是'x =「\\ r \\ n」' –

+0

@JerryJeremiah原始字符串文字'R「(...)」'允許您編寫該字符串無需轉義任何東西。 – melak47

回答

2

由於某些原因,^$在VS'正則表達式實現中表現爲多行方式,它們匹配任何行的開始/結束,而不是整個字符串。

您的懶惰捕獲組然後(?=\n--|$)將盡快退出,這恰好是最接近的換行符。

代碼示例中的正則表達式與您的問題中的正則表達式略有不同。在「 - header」行之後沒有匹配換行符,所以您的最後一個捕獲組匹配消費的頭文件和換行符之間的空字符串。

如果你從你的問題中使用正則表達式,最後一個捕獲組會匹配「 - header」之後的第一行。

我不知道爲什麼做到這一點,但它似乎TR1 implementation行爲以同樣的方式(雖然升壓\A\z錨提到的有不再可用)。

+1

感謝您的快速回答!我想這涉及到:http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2343和http://www.open-std.org/jtc1/sc22/ WG21 /文檔/ LWG-active.html#2503。這確實使得編譯器無法使用。有沒有辦法修改我的正則表達式在兩者上工作? (並做我想做的事) – martty

+0

我看到的最簡單的方法是手動插入文件標記的末尾,如' - end',並且只使用'(?= \ n - )'作爲lookaak。或者,只使用正則表達式來查找標記,然後在每個標記的結尾和開始之間分割字符串以獲得屍體:[example](http://coliru.stacked-crooked.com/a/0c9fb22ee9c74c1a) – melak47