2011-11-14 85 views
1

我在的圖案一串短字符串的:正則表達式或掃描器

<text @varible1 more text><, @variable2 text ><@variable3 text text> 

的@variableN是佔位符,每個支架是一個「部分」,這表明,如果封閉varibale是空字符串,'部分'將不存在。我想用正則表達式來提取每個部分,然後根據相應的變量是否爲空來重新組裝整個字符串。例如,如果我通過@變量1 =「你好」 @ variabl3 =「世界」的整個字符串應按返回:

text hello more text, world text 

起初我想,也許我可以使用正則表達式足夠的技巧來完成這項工作。然後我發現'部分'可以嵌套,並且我需要轉義一些特殊字符,例如 - '<','>'和'@'。我對它的看法越多,它就越像DSL。所以也許開發掃描儀會是一個更好的主意?我只知道一點關於編寫解析器的知識。所以我有點卡住,不知道要走哪條路。

如果有人在這種情況下有經驗,請說明一下。謝謝。

語法示例

<text @varible1 more text><, @variable2 text ><@variable3 text text> 
<text @varible1 more text><, @variable2 <, @nestedVaraible> text \<@userName\> > # with nesting and escaping 
<text @varible1 more text><, @variable2 text ><@variable3 \@twitterAccount> # escaping‘@ 

+0

如果您提及您使用的語言,可能會更容易引導您。有人可能已經有一些可配置的東西可以使用。當然,這聽起來像是一個解析器問題。 – fncomp

+0

PHP或Python會很好。 – Shawn

+0

Gotcha,你可以發表幾行文字,以便我可以瞭解你的語法要點。可能,我會建議修改[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/documentation.html)。 – fncomp

回答

1

你可以爲此使用PHP正則表達式,但如果你願意寫一個解析器的想法,我認爲這將是更好的投資時間的方式。下面是我拿出來你的文字匹配的正則表達式簡單:

$rgx = '~((?:[^<>\\\\]++|(?:\\\\.)++)++)|(<(?:(?1)|(?-1))*+>)~'; 

......和所有做的是分裂串入括號內的部分與一切。它只在一個層面上做到這一點;你必須將它遞歸地應用到每個括號內部分,直到你找出所有嵌套部分。更不用說所有其他的處理你必須做的,首先找到變量名稱。正則表達式可以非常強大,但更令人驚訝的是,在創建正則表達式的所有大腦出汗之後,剩下的工作量已經足夠。

Python的正則表達式幾乎沒有那麼強大,這可能是一件好事,但令人沮喪的是,雖然它是正則表達式像我這樣的癮君子。 :P它有什麼,而不是pyparsing。我從來沒有用過它,但一直聽到它的好消息。這可能正是你需要的。

2

如果你下來寫自己的解析器,這將是樂趣,這種情況下的話,我會找Douglas CrockfordJSLint。他發佈了所有的代碼,並有一些非常好的評論。

對於一些更一般的東西,我一定會看看這個方便的SO問題:Writing a simple parser