簡體   English   中英

在動態分隔符上拆分字符串

[英]String split on dynamic separator

我要處理以下問題。 我必須從通信緩沖區中提取消息。 可悲的是,通信協議糟糕透頂且結構不完善。 我想出的區分緩沖區中數據包的唯一方法是服務器發送的中間“ ack”命令。

例:

[Packet1] [ACK] [Packet2] [ACK] [Packet3]

我本可以使用String.Split(ACK),但分隔符也不一致。 雖然,有3條規則來標識ack數據包。

  1. 以“ AK”開頭。
  2. 以“ 0”或“ 1”結尾。
  3. 總長度為5個字符。

確認示例:
“ AKxxy”,其中:
xx:(01至99)
y:(0或1)

我希望可能會有一個正則表達式可以解決我的問題,但是我缺少所需的知識和時間。

是否有任何RegEx“專家”可能會對我有所幫助? 隨時提出任何解決方案。
謝謝。

編輯:
示例數據包 (我確實必須刪除了數據包信息):
AK010CONFIDENTIALPACKET1AK011CONFIDENTIALPACKET2AK020AK011CONFIDENTIALPACKET3AK021CONFIDENTIALPACKET4AK050

可悲的是,協議中的每個數據包都沒有以特定字符開頭或結尾,因此我無法區分它們。 為了識別每一個,我必須使用ack數據包將它們拆分,然后對每一個執行不同的檢查。

直接翻譯將是

\bAK\d{2}[01]\b

那是

\b    # a word boundary
AK    # AK literally
\d{2} # two digits
[01]  # one of 0 or 1
\b    # another word boundary

不過,該表達式需要進行測試(請參閱regex101.com上的演示 )。

編輯:

查看其他答案,這可能僅具有裝飾性價值。 @Jan和@ThymosK的解決方案

var packets = Regex.Split(buffer, @"AK\d{2}[01]");

看起來更加優雅。

但是我認為最好能看到所有解析都可以在正則表達式中移動。 即使它太不可讀:P

我設計了一個正則表達式,可以為您提供消息和分隔符分組:

(?s)(AK[0-9][0-9][0,1])|((?:(?!AK[0-9][0-9][0,1]).)*)

它可以像這樣分析文本: 在此處輸入圖片說明

您可以在這里進行測試。

和往常一樣,正則表達式只能寫。 我自己幾乎看不懂。 但是,我將嘗試通過以下步驟:

第一組很簡單,只需捕獲您的ack命令即可:

(AK[0-9][0-9][0,1])

第二組包含否定的超前(?! ... ) ,它匹配不帶...的正則表達式。 在這里,我們插入您的ack語法,因此,所有不跟ack都將匹配。 然后,我們添加一個字符,以擴展該字符以實際匹配ack任何字符。 基本上,第二部分斷言我們當前未跟隨ack ,然后添加了一個字符。 盡可能長的重復此過程,直到找到ack為止。 我把這變成第二組。

由於我目前沒有C#,因此無法使用C#正則表達式引擎將其包裝在代碼中。 但是python可以很好地工作,並提供了一個有用的findall方法,該方法可以為您提供所有這些組。

string interim = Regex.Replace(buffer, "AK\d{2}[01]", "|");
var commands = interim.Split('|');

假設| 不是有效的輸入字符。 您可以選擇非常具有異國情調的東西。

暫無
暫無

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

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