0

我正在使用一个允许使用正则表达式来控制实体命名的应用程序。

我有一堆这样命名的实体(每一行都是全名):

Subsystem - CPU - Utilisation [1x]
Subsystem - CPU - Utilisation [2x]
Subsystem - CPU - Utilisation [4x]
Subsystem - CPU - Queue Length
Subsystem - Disk - Space
Subsystem - Disk - Capacity

我需要使用正则表达式将每个变成这样:

CPU \n Utilisation
CPU \n Queue Length
Disk \n Space
Disk \n Capacity

(周围的空格\n是为了清楚起见,而不是在实际输出中)

我使用的正则表达式是:

Find:     ^Subsystem - (.*) - (.*)( \[.*\])$
Replace:  ${1}\n${2}

这适用于有[something]部分的人,但不适用于没有的人。

本质上,我需要获取part1and part2, wherepart2[行尾或行尾终止。

4

5 回答 5

3

此正则表达式应该为您提供匹配项:

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

在此Rubular 链接测试

编辑:
更新包括“队列长度”

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

在此Rubular 链接测试

分解:

  • ^Subsystem -:自我解释,匹配前几个常量字符
  • ([^\s-]+):捕获负字符集的组,基本上匹配任何内容,直到遇到空格或连字符
  • (.+?)(?=(?:\s+\[)|$): 正向前瞻匹配任何(非贪婪)总是后跟空格和“[”或行尾的东西。这?:是一个非捕获组,因此它不匹配它。
  • .*$: 匹配任何其他内容直到行尾
于 2012-08-30T15:20:15.330 回答
0

试试这个(使最后一部分可选 - 零或一次):

^Subsystem - (.*) - (.*)( \[.*\])?$

那应该工作!

此外,我喜欢使用http://rubular.com/来尝试我的正则表达式。

于 2012-08-30T15:12:10.283 回答
0

(在记事本++上测试)

.+?- +([\w ]+) +- +([\w ]+) .*

解释:

.+?-非贪婪,直到第一次冲刺 -

+([\w ]+) +- 第二个单词(只有字母和空格)匹配 1 个或多个空格

- +([\w ]+) - second word (only letters and spaces) match preceded by dash and one or more spaces

.* - the rest of the string

于 2012-08-30T15:29:27.380 回答
-1

然后您可以将 [...] 部分设为可选:

^Subsystem - (.*) - (.*?)(?: \[.*\])?$
于 2012-08-30T15:12:26.803 回答
-1

只需在 $ 符号之前再添加一个 *。
使用如下:
^Subsystem - (.*) - (.*)( \[.*\])*$

于 2012-08-30T15:17:20.893 回答