簡體   English   中英

正則表達式的替代方案

[英]Alternatives to Regular Expressions

我有一組字符串,其中嵌入了數字。 它們看起來像/ cal / long / 3/4/145:999或/ pa / metrics / CosmicRay / 24:4:bgp:EnergyKurtosis。 我想要一個表達式解析器

  • 易於使用。 舉幾個例子,某人應該能夠形成一個新的表達。 我希望最終用戶能夠形成新的表達式來查詢這組字符串。 一些潛在用戶是軟件工程師,其他人是測試人員,一些是科學家。
  • 允許對數字進行約束。 類似'/ cal / long / 3/4/143:#> 100&<1110'來指定帶有'/ cal / long / 3/4/143:'的字符串前綴,然后是(100,1110)之間的數字是期待。
  • 支持'|' 因此表達式'/ cal /(long | short)/ 3/4 / '將匹配'/ cal / long / 3/4/1:2'以及'/ cal / short / 3/4/1:2 ”。
  • 有Java實現可用或易於在Java中實現。

有趣的替代想法會很有用。 我也很想要實現我需要的正則表達式子集以及數值約束。

謝謝!

沒有理由重新發明輪子! 正則表達式引擎的核心是建立在數學和計算機科學的堅實基礎之上; 我們今天繼續使用它們的原因是它們主要是合理的,並且在可預見的將來不會得到改善。

如果您確實找到或創建了一些替代解析語言,只涵蓋了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://goldparser.org/about/how-it-works.htm

實際上你所描述的是Java 模式匹配器。 恰好使用正則表達式作為其語言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM