2014-02-28 129 views
2

我需要打破錶達式,如"(a+b*9 )-10"來提取/檢測()檢測圓括號,打開和關閉

這就是我現在的情況,但是這兩種情況都不起作用。

const regex Parser::rxOpenBracket = regex("^\\s*[(]\\s*$"); 

const regex Parser::rxCloseBracket = regex("^\\s*([)])\\s*$"); 

有些幫助會很好。謝謝!

+0

不要'\('和'\)'工作? – iavr

+0

你已經標記了這個C++,你能顯示你的代碼嗎? – devnull

+0

const正則表達式解析器:: rxOpenBracket =正則表達式(「^ \\ s * [\(] \\ s * $」); const正則表達式parser :: rxCloseBracket = regex(「^ \\ s *([\)])) \\ S * $「); 這是我目前正在嘗試的。這兩種情況都不起作用。 – chj

回答

1

卸下錨^$

const regex Parser::rxOpenBracket = regex("\\s*[(]\\s*"); 
const regex Parser::rxCloseBracket = regex("\\s*([)])\\s*"); 
1

^$是用於開始和線路的端部錨。如果你只是想知道是否有任何括號在所有的,沒有它必須在行的開始或結束,你可以將它們排除在外。另外,由於您匹配長度爲0或更長的空白區域,除非您匹配才能刪除它(用空字符串替換它),否則您也可以將其忽略。

這使得你與

const regex Parser::rxOpenBracket = regex("\\("); 

const regex Parser::rxCloseBracket = regex("\\)"); 

或者,如果你願意的話,

const regex Parser::rxOpenBracket = regex("[(]"); 

const regex Parser::rxCloseBracket = regex("[)]"); 
2

\s在一個正則表達式匹配的空白,^字符串的開頭匹配和$結束匹配。因此,實際上,您的正則表達式只會匹配包含單個開/關括號的字符串,可選擇前/後跟空白。沒有其他字符允許。

如果你真的只是在尋找括號字符,正則表達式是過度殺傷。只需使用std::string::find_first_of()

std::string data("(a+b*9)-10"); 

for (std::size_t idx = data.find_first_of("()"); idx != data.npos; idx = data.find_first_of("()", idx + 1)) 
{ 
    //idx now holds the index of a parenthesis: 
    assert(data[idx] == '(' || data[idx] == ')'); 
} 
3

或者你可以把它寫:

const regex Parser::bracketPair = regex("\\(.+?\\)"); 

表達翻譯是這樣的:

\(.+?\) 
\(=> The opening bracket (escaped as (would indicate a group in regex) 
. => Any character 
* => Zero or more times (referring to the .) 
? => Lazy, stop as soon as possible (referring to the *) 
\) => End bracket, also escaped 

利用這一點,你只會發現命中,與一開始打開括號,後面是沒有或任何數量的字符,直到找到右括號。

例如(hello world)會被處理,但)hello world(將被忽略

+0

編譯應該對'\(',因爲它不是一個有效的轉義序列,並且'\('可以被編譯器(該規範說實現定義)解釋爲'(')''給出警告。不是說正則表達式,而是關於字符串的字面意思。 – nhahtdh

+0

是的,你是正確的,你需要在字符串中跳過字符串的逃逸斜線。'「\\(。+?\\)」'。 ! – Mowday