正則表達式檢測用于&while循環的半冒號終止C ++在我的Python應用程序中,我需要編寫一個匹配C ++ for或while循環的正則表達式,該循環使用分號(;)。例如,它應匹配此:for (int i = 0; i < 10; i++);......但不是這個:for (int i = 0; i < 10; i++)這看起來很瑣事,直到您意識到開括號和右括號之間的文本可能包含其他括號,例如:for (int i = funcA(); i < funcB(); i++);我正在使用python.re模塊?,F在我的正則表達式看起來像這樣(我已經留下了我的評論,所以你可以更容易理解):# match any line that begins with a "for" or "while" statement:^\s*(for|while)\s*\( # match the initial opening parenthesis
# Now make a named group 'balanced' which matches a balanced substring.
(?P<balanced>
# A balanced substring is either something that is not a parenthesis:
[^()]
| # …or a parenthesised string:
\( # A parenthesised string begins with an opening parenthesis
(?P=balanced)* # …followed by a sequence of balanced substrings
\) # …and ends with a closing parenthesis
)* # Look for a sequence of balanced substrings\) # Finally, the outer closing parenthesis.# must end with a semi-colon to match:\s*;\s*這適用于所有上述情況,但只要你嘗試使for循環的第三部分包含一個函數就會中斷,如下所示:for (int i = 0; i < 10; doSomethingTo(i));我認為它會中斷,因為只要在開括號和右括號之間放置一些文本,“平衡”組就會匹配包含文本,因此該(?P=balanced)部分不再起作用,因為它不匹配(由于事實括號內的文字是不同的)。
3 回答

慕森王
TA貢獻1777條經驗 獲得超3個贊
您可以編寫一個非常簡單的例程,而不使用正則表達式:
設置一個位置計數器
pos
,使其指向您for
或之后的開始括號之前while
。設置一個開放的括號計數器
openBr
來0
。現在繼續遞增
pos
,讀取相應位置的字符,并openBr
在看到左括號時遞增,并在看到右括號時遞減。這將在開頭增加一次,對于“for (
”中的第一個開括號,對于其間的某些括號增加和減少一些,并0
在for
括號關閉時將其設置回。所以,不要當
openBr
是0
一次。
停止位置是你的結束for(...)
?,F在您可以檢查是否有分號。

守候你守候我
TA貢獻1802條經驗 獲得超10個贊
這是你不應該用正則表達式做的事情。只需一次解析字符串一個字符,跟蹤打開/關閉括號。
如果您正在尋找這個,那么您絕對不需要一個完整的C ++語法詞法分析器/解析器。如果你想練習,你可以編寫一個小的遞歸式解析器,但即便如此,只需匹配括號。

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
這是使用錯誤工具完成工作的一個很好的例子。正則表達式不能很好地處理任意嵌套的子匹配。你應該做的是使用一個真正的詞法分析器和解析器(C ++的語法應該很容易找到)并尋找意外的空循環體。
添加回答
舉報
0/150
提交
取消