簡體   English   中英

根據 substring 的長度獲取字符串的正則表達式

[英]Regular expression to get a strings depending on the length of a substring

您能否建議是否可能以及如何為下一個問題定義正則表達式:

我有 2 個由分隔符連接的“二進制”字符串。 假設分隔符始終為 3。

輸入數據示例:

11000031000111011001101111
0111000301000111011001101111
001310001110110011011110

在分隔符的右側,我需要 select 所有 '1+' blob,但我不想 select 1+ blob,長度等於分隔符左側的 1+ blob。

例如,在這個輸入上:

11000031000111011001101111

有這些 1+ blob:

left: 11
right: 1, 111, 11, 11, 1111

我需要 select 好的 1+ blob,但是 '11',因為這些也存在於左側。

所以在那個例子中我需要匹配: 1,111,1111

其他示例:

0111000301000111011001101111 ==> 1,11,11,1111
001310001110110011011110     ==> 111,11,11,1111

我還需要知道每個字符串的位置(匹配對象)。 了解此任務的復雜性以及是否可以構建 FSM 非常重要。 如果限制左側部分的大小(例如 < 8)怎么辦

由於您不僅特別要求正則表達式,而且要求有限的 state 機器,因此我可以特別證明這是不可能的。 在有限的 state 機器中,您必須有一些有限數量的n個狀態。 我們需要一個 state 用於在 3 的左側找到的每個1 s 序列長度。由於我們可以有無限多個可能長度的1 s 序列,因此不可能在有限多個狀態中編碼此信息。

如果您專門限制左側部分的大小,則有效限制了1 s 序列的最大大小。 這使它成為可能,盡管仍然不實用。

假設左邊的大小是n 對於出現的長度為 1 的每個可能組合,您需要一個 state ,即O(2^n) 祝你好運為此寫一個正則表達式。 您可能最終會有效地枚舉大多數可能的組合,並且很少使用實際的 state 機器邏輯。

示例 state 機器n=4 :注意超過 16 個狀態,這只是左側。 這里的每個“接受” state 都需要更復雜的邏輯來匹配右側。

在此處輸入圖像描述

這可以通過正則表達式(如評論中所述,比常規語言更強大)來實現。 但為此,我們需要正則表達式引擎來支持不同長度的后視。

不幸的是,大多數正則表達式引擎只支持固定長度的look-behinds。

但是,可以“反轉”原始字符串,以便后視變成前瞻(可以是可變長度)

這個正則表達式應該適用於反轉的字符串:

(?<!1)(1+)(?!1)(?=\d*3)(?!.*3\d*(?<!1)\1(?!1))

在這里有一個演示。

請記住,在演示中,字符串已被顛倒。

這就是正則表達式的工作方式:

(?<!1)(1+)(?!1)   # a blob of ones, capture it. Cannot match slices of the blob
(?=\d*3)          # must be followed by some '3'
(?!               # must not be followed by:
    .*            #   any prefix
    3             #   then a '3'
    \d*           #   then some numbers
    (?<!1)\1(?!1) #   and then a blob of ones equal to the captured one
)

或者當然,這可能超出了原始問題的“精神”,因為它需要反轉輸入字符串。

但是,我認為它仍然很有價值,因為理論上,如果使用支持可變長度的正則表達式引擎,可以在不反轉字符串的情況下制作類似的正則表達式。

暫無
暫無

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

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