我需要打破錶達式,如"(a+b*9 )-10"
來提取/檢測(
和)
。檢測圓括號,打開和關閉
這就是我現在的情況,但是這兩種情況都不起作用。
const regex Parser::rxOpenBracket = regex("^\\s*[(]\\s*$");
const regex Parser::rxCloseBracket = regex("^\\s*([)])\\s*$");
有些幫助會很好。謝謝!
我需要打破錶達式,如"(a+b*9 )-10"
來提取/檢測(
和)
。檢測圓括號,打開和關閉
這就是我現在的情況,但是這兩種情況都不起作用。
const regex Parser::rxOpenBracket = regex("^\\s*[(]\\s*$");
const regex Parser::rxCloseBracket = regex("^\\s*([)])\\s*$");
有些幫助會很好。謝謝!
卸下錨^
和$
:
const regex Parser::rxOpenBracket = regex("\\s*[(]\\s*");
const regex Parser::rxCloseBracket = regex("\\s*([)])\\s*");
^
和$
是用於開始和線路的端部錨。如果你只是想知道是否有任何括號在所有的,沒有它必須在行的開始或結束,你可以將它們排除在外。另外,由於您匹配長度爲0或更長的空白區域,除非您匹配才能刪除它(用空字符串替換它),否則您也可以將其忽略。
這使得你與
const regex Parser::rxOpenBracket = regex("\\(");
const regex Parser::rxCloseBracket = regex("\\)");
或者,如果你願意的話,
const regex Parser::rxOpenBracket = regex("[(]");
const regex Parser::rxCloseBracket = regex("[)]");
\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] == ')');
}
或者你可以把它寫:
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(
將被忽略
不要'\('和'\)'工作? – iavr
你已經標記了這個C++,你能顯示你的代碼嗎? – devnull
const正則表達式解析器:: rxOpenBracket =正則表達式(「^ \\ s * [\(] \\ s * $」); const正則表達式parser :: rxCloseBracket = regex(「^ \\ s *([\)])) \\ S * $「); 這是我目前正在嘗試的。這兩種情況都不起作用。 – chj