2017-08-29 136 views
1

我試圖讓一些正則表達式工作,但在我的具體使用情況下略有失敗。正則表達式 - 多個匹配,冒號和空格

考慮以下字符串例如

Device-1: P0_Node0_Channel0_Dimm0 size: 32 GB speed: 2133 MHz type: DDR4 

我想最好從這個字符串中提取信息這樣的:

Device-1: P0_Node0_Channel0_Dimm0 
size: 32 GB 
speed: 2133 MHz 
type: DDR4 

所以我嘗試了一下四周,測試了一些表情

(.*?):\s 

對某些方面有用。正確捕獲第一個參數名稱,但在此之後會弄亂空格。

:\s(.*?)\s\w*?:!? 

雖然這會捕獲第三個參數值中的空白空間,但它只給出第一個和第三個值。也沒有參數名稱。

有人有一個想法,我可以如何實現預期的行爲?

注:我在Excel VBA中這樣做,不知道是否所有功能都支持。

感謝

回答

1

您可以使用

([^\s:]+):\s*(.*?)\s*(?=[^\s:]+:|$) 

regex demo

詳細

  • ([^\s:]+) - 第1組:一個或多個字符不是空白和:其他
  • : - 冒號
  • \s* - 零個或多個空格
  • (.*?) - 組2:任何0+字符比換行符字符其他最多的第一次出現...
    • \s* - 零以上空格的後邊帶有...
    • (?=[^\s:]+:|$) - 比空白和:或字符串的結尾其他一個或多個字符
+0

最好的,謝謝! 我剛剛編輯答案,以刪除第二組比賽結束時的空間。 接受的答案。 由於6個字符的限制,我必須使用「use」編輯「may」。 – CuttingWide

+0

@CuttingWide:對不起,您的意思是編輯爲'([^ \ s:] +):\ s *(。*?)\ s *(?= [^ \ s:] +:| $)'?我編輯了答案。 –

0

這是一個AutoIt的例子:

#include <Array.au3> 
Local $str = 'Device-1: P0_Node0_Channel0_Dimm0 size: 32 GB speed: 2133 MHz type: DDR4' 
$r_A = StringRegExp($str, '([\w-]*\:)\s*(\w*\s|.*)', 3) 
ConsoleWrite(_ArrayToString($r_A, @CR) & @crlf)