[英]Alternatives to Regular Expressions
我有一組字符串,其中嵌入了數字。 它們看起來像/ cal / long / 3/4/145:999或/ pa / metrics / CosmicRay / 24:4:bgp:EnergyKurtosis。 我想要一個表達式解析器
有趣的替代想法會很有用。 我也很想要實現我需要的正則表達式子集以及數值約束。
謝謝!
沒有理由重新發明輪子! 正則表達式引擎的核心是建立在數學和計算機科學的堅實基礎之上; 我們今天繼續使用它們的原因是它們主要是合理的,並且在可預見的將來不會得到改善。
如果您確實找到或創建了一些替代解析語言,只涵蓋了Regex可以實現的可能性的一部分,那么您很快就會有一個用戶要求一個可以在Regex中表達的概念,但您的味道很簡單。 花時間解決尚未解決的問題!
我傾向於同意Rex M,盡管你對數值約束的第二個要求使事情復雜化。 除非你只允許非常基本的約束,否則我不知道在正則表達式中簡潔地表達它的方法。 如果有這樣的方式,請忽略我的其余答案並遵循其他建議。 :)
您可能想要考慮一個解析器生成器 - 比如經典的lex和yacc。 我對Java的選擇並不熟悉,但這里有一個列表:
http://java-source.net/open-source/parser-generators
如果您不熟悉,標准方法是首先創建一個將字符串轉換為標記的詞法分析器 。 然后你將這些標記傳遞給一個解析器,將你的語法應用到它們並吐出某種結果。
在您的情況下,我設想解析器導致正則表達式和其他條件的組合。 對於您的數值約束示例,它可能會為您提供正則表達式\\/cal/long/3/4/143:(\\d+)\\
以及要應用於需要該數字的第一個分組( \\d+
部分)的約束介於100和1100之間。然后,您可以將RE應用於候選人的字符串,並將約束應用於那些候選人以找到您的匹配項。
這是一個非常復雜的方法,所以希望有一種更簡單的方法。 我希望至少能給你一些想法。
Java約束是一個嚴重的約束。 我建議使用解析組合器 ,但您必須使用類而不是函數將想法轉換為Java。 關於這個主題有很多很多論文; 最容易接近的是Graham Hutton的高階解析函數 。 Hutton的方法使得根據數字大小等條件決定成功或失敗特別容易,如您在示例中所示。
不幸的是,並非所有程序員(包括我自己)都熟悉RegEx。 這通常意味着我們最終會編寫自己的字符串解析邏輯,否則RegEx可以很好地為我們服務。
這並不總是壞事。 在某些情況下,可以編寫一個更優雅,更易讀並滿足問題域精確需求的DSL(一類,一組緊密結合的方法)。 麻煩的是,它可能需要數十次迭代才能將問題提煉成簡單直觀的DSL。 只有當DSL在應用程序或大型社區中被廣泛使用時才會出現這種麻煩。 不要為只偶爾出現的問題寫出優雅的解決方案。
如果您要去解析器路線,請查看GOLD Parsing System。 它通常比YACC更好,比純正的正則表達式更清晰,並且支持Java。
http://java-source.net/open-source/parser-generators和http://catalog.compilertools.net/java.html包含此目錄的工具。 比較stackoverflow問題如何解析代碼以在Java中構建編譯器? 。
實際上你所描述的是Java 模式匹配器。 恰好使用正則表達式作為其語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.