坚持使用正则表达式来排除可选项

时间:2012-08-30 15:08:51

标签: regex

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

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

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]部分的部分,但不适用于没有部分的部分。

基本上,我需要获取part1part2,其中part2[或行尾终止。

5 个答案:

答案 0 :(得分:3)

这个正则表达式可以让你得到匹配:

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

在此Rubular link

进行测试

修改
更新为包含“队列长度”

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

在此Rubular link

进行测试

故障:

  • ^Subsystem -:自我解释,匹配前几个常量字符
  • ([^\s-]+):捕获负字符集的组,基本上匹配任何东西,直到它击中空格或连字符
  • (.+?)(?=(?:\s+\[)|$):积极前瞻以匹配任何(非贪婪)始终跟随EITHER空格和“[”OR行尾的任何内容。 ?:是一个非捕获组,因此它不匹配。
  • .*$:匹配其他任何内容,直到行尾

答案 1 :(得分:0)

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

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

这应该有用!

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

答案 2 :(得分:0)

(在Notepad ++上测试)

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

说明:

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

+([\w ]+) + - 第二个单词(仅限字母和空格)在一个或多个空格之间匹配

- +([\w ]+) - 第二个单词(仅限字母和空格)匹配前面有短划线和一个或多个空格

.* - 字符串的其余部分

答案 3 :(得分:-1)

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

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

答案 4 :(得分:-1)

在$符号前需要另一个* 使用方法如下:
    ^Subsystem - (.*) - (.*)( \[.*\])*$