2012-02-03 133 views
2

我承認自從使用C++以來已經有一段時間了,但從我所知道的情況來看,我的代碼應該可以工作。我試圖從包含代碼的文件中替換/刪除所有塊註釋。我把我正在搜索的整個文件放入一個字符串中,並且該字符串包含換行符。爲什麼這個正則表達式不適用於C++ TR1?

這裏是我的代碼

std::tr1::regex rx1("[/][*][\S\s]*?[*][/]"); 
stringName = std::regex_replace(stringName, rx1, std::string("")); 

據我所知,這應該在這裏包括新線匹配/ *什麼*/

我甚至已經測試了http://gskinner.com/RegExr/,在那裏它匹配完美地阻止評論。問題是,塊註釋並未被取代。這是某種TR1特定的錯誤嗎?

+2

你應該避免反斜槓「\\」 – 2012-02-03 20:01:19

+0

'*?'是合法嗎?儘可能頻繁地匹配,但至少一次?這不等於'+'嗎? – RedX 2012-02-03 20:02:15

+0

@RedX:'?'是對'*'的非貪婪修飾符。 – 2012-02-03 20:03:23

回答

1

軌道上的輕度軌道將我推向正確的道路,但結果顯示*和?不能用於[]括號內的參數。要做到這一點的方法是使用一個具有或聲明的非捕獲組。

代碼找到多行塊註釋:

std::tr1::regex rx3("[/][*](?:\s|.|\n)*?[*][/]"); 

(?:表達式)是如何讓一個非捕獲組。您可以應用*和?在外面。在裏面,使用|作爲或聲明。

+0

'*?'絕對_can_適用於字符類,除非'tr1'的實現是完全愚蠢的。 – 2012-02-05 01:59:51

3

你必須考慮到你正在做的事情有層次。

  • 首先,你正在字符串文字中建立一個字符串。對於人來說,它看起來像一個正則表達式,但字符串文字並不在意。

    該字符串文字除其他外包含分別由\S\s產生的特殊字符(就像\n是如何特殊的那樣)。

  • 然後,您將此字符串—特殊字符和所有—傳遞給正則表達式引擎。

相反,你需要進行反斜槓逃逸,只是字符串文字

std::tr1::regex rx1("[/][*][\\S\\s]*?[*][/]") 

的正則表達式引擎便會看到正確的表達:

[/][*][\S\s]*?[*][/] 

此外,我會檢查tr1的引擎是否需要分隔符。他們通常是個好主意。

+0

或者可以使用一個原始字符串文字:'R「([/] [*] [\ S \ s] *?[*] [/])'''即使在早期階段發生的三字母,二字母和UCN解釋,在原始字符串文字中也是_undone_。原始字符串文字似乎用於兩件事情,正則表達式或類似的字符串,以及多行字符串文字。 – bames53 2012-02-03 20:37:26

+0

@ Bames53:是的,還是那個。但是trigraphs如何「撤消」?預處理器將足夠的信息傳遞給編譯器來處理這個問題? – 2012-02-03 20:40:09

+0

我明白你的意思是不得不劃定反斜槓。我應該抓住那個。這就是說,無論出於何種原因,它仍然不起作用。是否可以在[]中使用*函數?我開始思考不了,我沒有在msdn網站上看到任何其他示例。如果沒有,你可以告訴我想要做什麼。我還會怎麼做呢? – Brandon 2012-02-03 21:16:15

相關問題