正则表达式模式将不同的变量分组

时间:2015-06-07 23:45:28

标签: regex regex-group

我一直在努力为字符串找到合适的正则表达式模式。

字符串是这样的:

0|   DIMM: Hynix      |   Not installed    |   DIMM: Micron     |   DIMM: Hynix      |

它也可能会变成这样的东西。

1|   Not installed    |   DIMM: Samsung    |   DIMM: Hynix      |   DIMM: Hynix      |

Dimm:变量可以改为三星,海力士,微米,甚至不安装。我想将每个单独分组,例如“Hynix”,“Micron”,“Samsung”和“Not installed”。我不想包括DIMM:在那里。

我试过这个,但只抓住了第一个变量。

(Not installed|(?<=DIMM:)\s[a-zA-Z]+)

复制粘贴它3次不会将其他变量分组。任何想法?

1 个答案:

答案 0 :(得分:1)

使用1个模式正则表达式,后面看

从您的正则表达式中汲取信息并利用 Stribizhev 评论,您还可以使用:

((?<=DIMM: )\w+|Not installed)

Regular expression visualization

<强> Working demo

匹配信息

MATCH 1
1.  [11-16] `Hynix`
MATCH 2
1.  [26-39] `Not installed`
MATCH 3
1.  [53-59] `Micron`
MATCH 4
1.  [74-79] `Hynix`
MATCH 5
1.  [92-105]    `Not installed`
MATCH 6
1.  [119-126]   `Samsung`
MATCH 7
1.  [140-145]   `Hynix`
MATCH 8
1.  [161-166]   `Hynix`

使用4种模式正则表达式

我知道这不是一个漂亮的正则表达式,但可以帮助你这样做:

\|\s*(?:DIMM: )?(.*?)\s*\|\s*(?:DIMM: )?(.*?)\s*\|\s*(?:DIMM: )?(.*?)\s*\|\s*(?:DIMM: )?(.*?)\s*\|

<强> Working demo

Regular expression visualization

使用此正则表达式将为您提供4个组中完整线捕获内容的匹配项。缺点是正则表达式非常难看。结果如下:

匹配信息

MATCH 1
1.  [11-16] `Hynix`
2.  [26-39] `Not installed`
3.  [53-59] `Micron`
4.  [74-79] `Hynix`
MATCH 2
1.  [92-105]    `Not installed`
2.  [119-126]   `Samsung`
3.  [140-145]   `Hynix`
4.  [161-166]   `Hynix`

使用1个模式正则表达式

刚刚找到了你可能会发现的另一个正则表达式:

\|\s*(?:DIMM:)?\s?(\w+\s?\w+)

<强> Working demo

Regular expression visualization

此正则表达式仅使用1个捕获组,它比第一个短,但它被多次使用以匹配您想要的。因此,您必须添加更多逻辑来迭代您知道它属于完整行的前4个匹配项。结果如下:

匹配信息

MATCH 1
1.  [11-16] `Hynix`
MATCH 2
1.  [26-39] `Not installed`
MATCH 3
1.  [53-59] `Micron`
MATCH 4
1.  [74-79] `Hynix`
MATCH 5
1.  [92-105]    `Not installed`
MATCH 6
1.  [119-126]   `Samsung`
MATCH 7
1.  [140-145]   `Hynix`
MATCH 8
1.  [161-166]   `Hynix`