我正在使用一个允许使用正则表达式来控制实体命名的应用程序。
我有一堆像这样命名的实体(每一行都是全名):
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]
部分的部分,但不适用于没有部分的部分。
基本上,我需要获取part1
和part2
,其中part2
由[
或行尾终止。
答案 0 :(得分:3)
这个正则表达式可以让你得到匹配:
^Subsystem - ([^\s-]+) - ([^\s\[]+)(?=(?:\s\[)|$).*$
修改强>
更新为包含“队列长度”
^Subsystem - ([^\s-]+) - (.+?)(?=(?:\s+\[)|$).*$
进行测试
故障:
^Subsystem -
:自我解释,匹配前几个常量字符([^\s-]+)
:捕获负字符集的组,基本上匹配任何东西,直到它击中空格或连字符(.+?)(?=(?:\s+\[)|$)
:积极前瞻以匹配任何(非贪婪)始终跟随EITHER空格和“[”OR行尾的任何内容。 ?:
是一个非捕获组,因此它不匹配。.*$
:匹配其他任何内容,直到行尾答案 1 :(得分:0)
试试这个(让最后一部分可选 - 零或一次):
^Subsystem - (.*) - (.*)( \[.*\])?$
这应该有用!
另外,我喜欢使用http://rubular.com/来试用我的正则表达式。
答案 2 :(得分:0)
(在Notepad ++上测试)
.+?- +([\w ]+) +- +([\w ]+) .*
说明:
.+?-
非贪婪直到第一次冲刺 -
+([\w ]+) +
- 第二个单词(仅限字母和空格)在一个或多个空格之间匹配
- +([\w ]+)
- 第二个单词(仅限字母和空格)匹配前面有短划线和一个或多个空格
.*
- 字符串的其余部分
答案 3 :(得分:-1)
然后你可以将[...]部分设为可选:
^Subsystem - (.*) - (.*?)(?: \[.*\])?$
答案 4 :(得分:-1)
在$符号前需要另一个*
使用方法如下:
^Subsystem - (.*) - (.*)( \[.*\])*$