2017-03-23 31 views
2

我想整理我的所有的JavaScript函數把它們按照字母順序在一個月前左右,並用正則表達式玩今天讓我再次想到這一點。我只想匹配外部函數,以避免嵌套函數被移動,幾乎有我認爲,但有一些我失蹤。正則表達式匹配所有的JavaScript功能

我用這個頁面作爲起點上漏接泡沫的答案。 Regular Expression to match outer brackets

function\s.*\(.*\).*\{(?>[^.*\n*]+|(?R))*\} 

這將匹配所有的功能定義和捕捉參數到第一個大括號。出於某種原因,我不能得到它,而它是表達的一部分匹配換行模式[^.*\n*]+,但是當它是所有的本身它匹配就好了。

我用崇高的文本編輯器作爲我的工具來搜索,但它會在一個JS文件可能是一種簡單的方法來操作代碼結束。

+2

「把它們按照字母順序」 ---這是一個可怕的想法,真的。順序必須是語義驅動的。無論如何,如果你想正確解決它 - 採取任何JS語法解析器,它會更容易和更可靠100倍。 – zerkms

+0

你將不得不尋找新的線。 '\ nfunction。*?\ n \}'這可能是... – Akxe

回答

0

這似乎與所有的功能和自己的身體,我(除了在一個行中定義的,這將需要額外的表達式)

function.*\(.*\).*\{(.|\n)*?\n\} 

或者,如果你不想趕體只需添加?:

function.*\(.*\).*\{(?:.|\n)*?\n\} 

的想法是要匹配,直到我們通過一個新行結束以及結束的花括號:這種方式沒有支架(或內部函數)在體內將與我們的搜索碰撞。

+0

出於好奇,爲什麼downvote? – floribon

1

與它擺弄了一天後,這裏是一個正則表達式,這將打破一個js文件,以匹配所有命名功能,然後把它分解成函數名稱,參數和身體。與Floribon的解決方案不同,這將匹配任何格式樣式,甚至縮小,並忽略嵌套的大括號和函數。

function\s+(?<functionName>\w+)\s*\((?<functionArguments>(?:[^()]+)*)?\s*\)\s*(?<functionBody>{(?:[^{}]+|(?-1))*+}) 

https://regex101.com/r/sXrHLI/1