簡體   English   中英

如何確定正則表達式中的子字符串?

[英]how to determine the sub string in a regular expression?

我已經實現了模式搜索的特里樹,並且工作正常。 使用這個特例,我可以找到以O(n)復雜度顯示在文本中的所有關鍵字。

問題是我想將正則表達式用於我的模式(關鍵字),並希望找到文本中存在的所有關鍵字。

示例:我寫了[a-z0-9 \\。] {6,30} \\ @ [a-z0-9 \\。] {2,12} \\。[a-z0-9] {2,6}來查找電子郵件ID,它將為我提供正確的信息,但找不到位於第一個或第二個塊下的子字符串。

例如我有文本。 examplegmail@gmail.com

和關鍵字是: ample mail

在此示例中,此正則表達式將告訴我電子郵件ID的結尾位置,但不會告訴我有關amplemail關鍵字的任何信息。

編輯:假設我有正則表達式為a *(b | cd?)+ ,而DFA看起來像:

在此處輸入圖片說明

現在我有像dfdfdacbcbbcb這樣的數據,它將在到達ac等每個字符后告訴我模式,但是如何得知結束模式的長度?

您的“ trie”包含以下操作:“ test for char”“分支到第n個子樹”。

添加另一個運算符以保存位置:“記住第N個字符索引”,它將特里正在檢查的當前字符位置寫入指針數組的第n個插槽到字符串中。

將這些運算符插入您的(抽象的)特里規范中,編譯為真實的特里,然后運行它。 當特里匹配器“交叉”匹配中的各個關鍵點時,它可以將這些點記錄在字符串緩沖區中。 在最終比賽中,您有一個指向比賽子部分的指針數組(任意數量)。

例如:

[a-z0-9\.]{6, 30}\@[a-z0-9\.]{2,12}\.[a-z0-9]{2,6} 

想象我想在@的左右選擇文本。

我添加了位置節省運算符,我將其任意表示為“ #n”:

#1[a-z0-9\.]{6, 30}#2\@[a-z0-9\.]{2,12}\.[a-z0-9]{2,6}#3

這將(而不是瑣碎地)捕獲起始位置,“ @”符號的位置,以及(而不是瑣碎地)終止位置,作為位置1、2和3。當然,在中間,您可以更多覺得合適。

[許多正則表達式系統在遇到分組運算符(...)時會隱式執行此操作,並從左到右對分組進行編號。 這樣總可以滿足要求,因為您總是可以在這樣的分組運算符中包裝一個有趣的子正則表達式。 我喜歡顯式指示方案; 讀者和模式匹配器很清楚,它必須在其中插入這些位置捕獲操作。 我們已經使用上面的#n符號實現了正則表達式匹配器。]

如果您正在尋找各種各樣的關鍵字和相關文本,則您的trie中可能會有很多選擇運算符。 您可以在每個選擇分支的適當位置添加這些位置捕獲運算符,以選擇與關鍵字相關的信息。 您可能需要添加另一個運算符“可識別的關鍵字k”,以幫助解釋模式匹配器結果的代碼了解找到了哪些特殊關鍵字,以及如何解釋位置索引。

暫無
暫無

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

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