2015-04-29 51 views
6

我需要一個正則表達式來捕獲圓括號之間的參數。爭論之前和之後的空白不應被捕獲。例如,"(ab & c)"應返回"ab & c"。如果需要前導空白或尾隨空白,則可以將參數括在單引號中。所以,"(' ab & c ')"應該返回" ab & c "VS13正則表達式中的錯誤:替代方案的錯誤順序?

wstring String = L"(' ab & c ')"; 
wsmatch Matches; 
regex_match(String, Matches, wregex(L"\\(\\s*(?:'(.+)'|(.+?))\\s*\\)")); 
wcout << L"<" + Matches[1].str() + L"> " + L"<" + Matches[2].str() + L">" + L"\n"; 
// Results in "<> < ' ab & c '>", not OK 

看來,第二個替代方案相匹配,但它也佔用了第一個報價前的空間!在左括號後面應該有\s

卸下第二個選擇:

regex_match(String, Matches, wregex(L"\\(\\s*(?:'(.+)')\\s*\\)")); 
wcout << L"<" + Matches[1].str() + L">" + L"\n"; 
// Results in "< ab & c >", OK 

使其成爲一個捕獲組的可選方法:

regex_match(String, Matches, wregex(L"\\(\\s*('(.+)'|(.+?))\\s*\\)")); 
wcout << L"<" + Matches[1].str() + L"> " + L"<" + Matches[2].str() + L"> " + L"<" + Matches[3].str() + L">" + L"\n"; 
// Results in "<' ab & c '> < ab & c > <> ", OK 

我俯瞰什麼?

+0

一個奇怪的行爲。你是否嘗試用'[^']替換點來看看會發生什麼?你是否嘗試在沒有wchar_t的情況下做同樣的事情? (注意ecmascript正則表達式引擎不是很流利,有多字節字符) –

+0

非常有趣的效果 - 在g ++中使用libstdC++它在VS2013中起作用,但在開始時沒有空間。在clang ++和libC++中,第一組是匹配的。所以它是3個標準庫的3種不同行爲:) regexr.com(我相信JavaScript變體)認爲libC++是正確的。 – Predelnik

+0

@Cimimir:與「正常」字符相同的問題;但用'[^']代替點確實使它起作用。 @Predenik:我認爲第一組應該是匹配的,我發佈了這個問題,因爲我從經驗中知道用正則表達式犯錯誤有多容易...... –

回答

1

這裏是我的建議,合併兩個備選方案爲1:

wstring String = L"(' ab & c ')"; 
wsmatch Matches; 
regex_match(String, Matches, wregex(L"\\(\\s*(')?([^']+)\\1\\s*\\)")); 
wcout << L"<" + Matches[2].str() + L"> " + L"\n"; 

\(\s*(')?([^']+)\1\s*\)正則表達式中使用反向引用,以確保我們有一個'之初,爲了到底要不要捕捉'something 。該值被抓進2組

輸出:

enter image description here

+0

它是爲您工作還是您需要進一步的幫助? –

+0

工作正常,謝謝。 –