2014-02-24 60 views
2

我試圖使用正則表達式來匹配與函數對應的某些字符串組。現在看起來像這樣:匹配所有內部圓括號但不是外部

(Spreadsheet.[^)\)]+\)) 

它在哪裏找到變量Spreadsheet,它具有作爲屬性的功能。表達式繼續前進直到到達結束圓括號。對於簡單的功能,如

Spreadsheet.ADD(1,2) 

正則表達式將正常工作。

但是,如果我嘗試進行任何類型的嵌套,則表達式不起作用,因爲它將停止在內部圓括號而不是最後一個圓括號。

Spreadsheet.ADD(Spreadsheet.ADD(1, 2), 3) 

因此,「,3)」未被識別並且結束被忽略。當然,由於我的代碼處理它的方式,這個不尋常的字符串最終導致錯誤。

有沒有人有更多的正則表達知識知道如何改變它只會停在最後一個括號而不是第一個?

謝謝。

+1

這不是一個重複,至少不是我可以告訴你發佈的問題。 我不想多次匹配我的表情。我想匹配我的表達從開始括號到結束括號,而不管內部有多少個括號。 –

+0

'Spreadsheet.ADD(1,2)+ Spreadsheet.ADD(3,4)'? – falsetru

+0

部分輸入由用戶指定。另外,這些功能不僅僅是算術。嵌套是我想要的東西。 –

回答

2

假設你只想匹配你在問題中陳述的形式的函數。如果你想匹配任何類型的函數(包括操作符,嵌套註釋等),那麼你想要的正則表達式會很困難,請參閱here。反正到最後括號匹配,您可以使用:

(Spreadsheet\..+\)) 

這將匹配

Spreadsheet.ADD(1,2)

Spreadsheet.ADD(Spreadsheet.ADD(1, 2), 3)

Spreadsheet.ADD(Spreadsheet.ADD(1, 2), 3)

(foo中而不是比賽的一部分)

您的正則表達式與完整字符串不匹配的原因是因爲它會在發現不是)這是第一個)的字符時停止。此外,因爲Spreadsheet.將匹配Spreadsheeta,Spreadsheetb,Spreadsheetc。要匹配你需要的點號\.

在我的正則表達式.+)將包括最後一個括號,因爲+是貪婪的,所以它會得到最長的匹配。順便說一下,你會指定一個非貪婪的匹配使用+?

+0

非常感謝。這個表達正是我需要的。我已經有一種解析表達式的方式來進行正確的評估,但是給定一個特定的用戶輸入,我不知道如何處理嵌套。 \ \。是很好的建議,因爲Spreadsheetb會產生錯誤,儘管這不是通過用戶輸入提供的。 (用戶鍵入「ADD(1,2)」,其餘的文本在後臺添加 我知道爲什麼正則表達式失敗,但我不知道如何調整它以獲得正確的嵌套。 –

+0

@NickFlekerFelker - 非常好,很樂意幫忙。 – acarlon