2012-07-03 64 views
2

使用Ruby我想要帶一個Regexp對象(或一個表示有效正則表達式的字符串;您的選擇)並標記它以便我可以操縱某些部分。Tokenize(lex?parse?)正則表達式

具體而言,我想帶一個正則表達式/串是這樣的:

regex = /var (\w+) = '([^']+)';/ 
parts = ["foo","bar"] 

和創建替換字符串,從陣列替換爲字面每個捕獲:

"var foo = 'bar';" 

甲天真的基於正則表達式的解析正則表達式的方法,例如:

i = -1 
result = regex.source.gsub(/\([^)]+\)/){ parts[i+=1] } 

...會失敗例如嵌套的捕獲組或非捕獲組,或者在字符類中包含括號的正則表達式。因此,我希望將正則表達式分解成語義上有效的片斷。

是否有一個現有的正則表達式解析器可用於Ruby?有一個(恐怖恐怖)已知的正則表達式,完全匹配正則表達式嗎?有沒有我找不到的寶石?

這個問題的動機是希望找到一個乾淨,簡單的答案this question

+1

一個有趣的問題。正則表達式是否是正則表達式? –

+0

@ acheong87鑑於任意嵌套的捕獲組,我認爲不是。然而,我對常規語言的形式主義的瞭解非常有限。 – Phrogz

+0

你看過正則表達式變量插值嗎? – iain

回答

2

我在GitHub上有一個名爲:Dynamic (?:Regex Highlighting)++ with Javascript!的JavaScript項目,你可能想看看。它分析以自由間隔和非自由間隔模式編寫的兼容PCRE的正則表達式。由於正則表達式是用功能較少的JavaScript語法編寫的,因此這些正則表達式可以輕鬆轉換爲Ruby。

請注意,正則表達式可能包含任意嵌套的括號結構,並且JavaScript沒有遞歸正則表達式功能,所以代碼必須從內向外解析嵌套parens樹。它有點棘手,但效果很好。一定要在highlighter demo page上嘗試一下,在那裏你可以輸入並動態地突出顯示任何正則表達式。用於解析正則表達式的JavaScript正則表達式記錄爲here

相關問題