2016-01-28 28 views
1

我試圖從在JavaScript(所以我不能使用回顧後)字符串中提取函數符號,下面是一些例子:正則表達式來提取函數符號與嵌套函數(JavaScript的)

  • F(2 )應該匹配F(
  • F(10)克(8)應該匹配F(克(
  • F(2 + G(3))應該匹配F(克(
  • F(2 +克(SQRT(10)))應該匹配F(克(
  • F(G(2))應該匹配F(克(

現在我使用

/\b[a-z]\([^x]/g 

,因爲我不想匹配時,它是一個由字母(如開方)的字符串時,纔會有一個然後寫一個括號。我遇到的問題是列表中的最後一個(嵌套函數)。 (是不是\ b漁獲量的一部分,所以它不匹配。

我目前的計劃是以後每增加一個空格(使用類似

input = input.replace(/\([^\s]/g, '('); 

其將嵌套函數,這樣\ b在我開始搞亂輸入字符串之前,我想我會問在這裏是否有更好的方法來做到這一點。顯然,正則表達式不是我超強的,但是我正在努力學習如此解釋與答案將不勝感激(雖然我會採取任何指針,我也可以谷歌自己!我不完全確定在這裏搜索什麼)。

+0

爲什麼你有[^ x]? – Gavriel

+0

'/ \ b [az] \(/ g'根據規則確定[this](https://regex101.com/r/xM6eK4/2)有效嗎? –

+0

我爲f(x)和表達式的簡寫,這意味着我永遠不會有像x(x)這樣的函數,但是我確信這一點。 –

回答

1

在這裏的一點是,[^x]是否定的字符類仍然比賽(後消耗象徵,它可以防止重疊匹配。爲了使檢查下一個字符不是x,用前瞻:

\b[a-z]\((?!x) 
     ^^^^^ 

regex demo

也許,你想失敗的比賽只有一個x裏面f()g()唯一的信:

\b[a-z]\((?!x\)) 

Regular-expressions.info

如果您想匹配某些未被其他東西跟隨的東西,則消極前瞻是不可或缺的。在解釋[字符類] [4],時,本教程解釋了爲什麼不能使用否定字符類匹配q而不是後跟u。負向預覽提供瞭解決方案:​​。負向視圖結構是括號中的一對括號,開頭括號後面跟着一個問號和一個感嘆號

+1

啊,這很有道理,我需要閱讀消費,我顯然沒有正確處理它。 –

+1

欣賞鏈接呢! –

0

我認爲你必須刪除[^ X]:

"f(g(2))".match(/\b[a-z]\(/g) 
// ["f(", "g("]