2011-03-28 50 views
1

已回答從閱讀我所能得到的結果來看,這似乎不可能在正則表達式中完成,所以我使用正則表達式來匹配函數模式,然後使用支撐位置來標記結果。不是最好的答案,但解決不了。匹配函數調用列表中的第一個函數

我試圖在功能列表中匹配第一個單一功能例如

$string = "user('firstname'), user('lastname')" 

但我不知道如何成功模式相匹配的子功能調用,可以包含任何類型的參數,即一個字符串,如「我的字符串)」,例如

$string = "user('my string)!'), user('lastname')" 

因此,任何模式不能在自身內匹配任何括號,即用戶(「我的字符串)

我不關心匹配不同類型的參數,而只是把整個第一個函數抓住。當前的正則表達式如下。

'/([a-z0-9\_]+)\((.*)\)/' 

我會想象某種負前瞻的/後面是必需的斷言,但我還沒有達到構建模式,水平。任何幫助將不勝感激。

正則表達式的味道是PHP。

編輯1功能列表也可能是這樣的。

user((5*5)+10), user(otherfunc()) 

在這種情況下,圖案將具有相匹配的用戶((5 * 5)10)在此之後後處理用戶(otherfunc())。我有一個表達式標記器,可以將參數和表達式進行分解。除了多種埋藏功能之外,它確實很棒。

+0

逃命那些壞字符字符串,那麼你的正則表達式將是一個* LOT *更容易。 – Blender 2011-03-28 21:06:58

+0

@Blender - 不幸的是不是一個選項。 – buggedcom 2011-03-28 21:16:41

回答

1

嘗試:

(?:\s*([a-z\d_]+)\('[^']+'\)),? 

這也將匹配任何數量的功能(具有全局匹配/ g標誌),這樣即:

user('firstname'), user('lastname'),user3('la!(["())!gstname') 

編輯:對於你的努力要做,這是不適合正則表達式,因爲你正在處理嵌套結構,即遞歸。單獨循環每個字符並以與真實語言相同的方式解析它會更好。

+0

這是假設參數是一個字符串,雖然不是嗎?如果是這樣,我更新了我的例子。 – buggedcom 2011-03-28 21:15:52

+0

剛剛意識到這一點。還是要謝謝你的幫助。 – buggedcom 2011-03-28 21:47:56

0

我認爲'/([a-z0-9\_]+)\(\'([^\']*)\'\)/'應該沒問題。至少,如果參數始終是單引號內的字符串。這是你需要還是必須更先進?

+0

麻煩是參數可能是任何東西,包括多個大括號或埋藏標籤。即用戶((5 * 5)+10)或用戶(otherfunc())。我有一個表達式標記器,可以將參數和表達式進行分解。除了多種埋藏功能之外,它確實很棒。 – buggedcom 2011-03-28 21:12:45

0
'~^[a-z0-9_]++\(([^\'"()]*+(?:(?:\'[^\'\\\\]*+(?:\\\\.[^\'\\\\]*+)\'|"[^"\\\\]*+(?:\\\\.[^"\\\\]*+)"|\((?1)\))[^\'"()]*+)*+)\)~' 

沒有測試過。

稍微更具可讀性:

'~^ 
[a-z0-9_]++ 
\((
    [^\'"()]*+(?:(?: 
      \'[^\'\\\\]*+(?:\\\\.[^\'\\\\]*+)\' 
     | "[^"\\\\]*+(?:\\\\.[^"\\\\]*+)" 
     | \((?1)\) 
    )[^\'"()]*+)*+ 
)\) 
~x' 
相關問題