[英]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.