2012-03-16 84 views
4
^0806EA^0406F0^^^^^^EF07F7--^E3DC03--^EAFE02-- 
^0406F0^^^FFE209^^^DFF107^^^F6F508^^^E4DE01^^^EF07F7--^E803E6-- 

在上面的代碼中,我想拆分這^但問題是,這個十六進制數據具有相同的模式^。如何拆分和保存到陣列

我想要的結果是這樣的:

^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02-- 
^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6-- 

或:

0806EA 0406F0^^^^^ EF07F7-- E3DC03-- EAFE02-- 
0406F0^^ FFE209^^ DFF107^^ F6F508^^ E4DE01^^ EF07F7-- E803E6-- 

回答

2

既然你不想在分割用完任何字符 - 而你也似乎並不想讓他們作爲一個羣體自己,你需要的是所謂的「零寬度斷言」。由於我們正在談論插入符號,字邊界不起作用。它不在一條線的起點或終點,因此唯一可以工作的ZWA是前瞻或後視。

既然你要打破你的塊在特定模式的前,我建議在先行,包括:插入符+非插入符號或字符串的結尾,就像這樣:

split /(?=\^(?:[^^]|$))/; 

如下圖所示:

while (<DATA>) { 
    my @list = split /(?=\^(?:[^^]|$))/; 
    say "@list"; 
} 

__DATA__ 
^0806EA^0406F0^^^^^^EF07F7--^E3DC03--^EAFE02-- 
^0406F0^^^FFE209^^^DFF107^^^F6F508^^^E4DE01^^^EF07F7--^E803E6-- 

輸出:

^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02-- 

^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6-- 
+0

我測試你的代碼與我有的數據和結果像我想要的。 完美....非常感謝。 – dummys01 2012-03-16 13:58:24

2

方式一:

perl -pe 's/(?<=.)(?=\^\w)/ /g' infile 

說明:

s/regex/replacement  # Substitution command. 
(?<=.)     # Positive look-behind for any char. 
(?=\^\w)     # Positive look-ahead for '^' plus a word character. 
          # Add a space between them. 

結果:

^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02-- 
^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6--