2017-08-29 105 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)