I解析多行文本,例如,如下所示:
{"Name":"pathology[876]", "cpu":"0.58","mem":"18.39", "vm":"1542.14"}
{"Name":"/opt/pathology/bin/pathology[876]", "cpu":"0.58","mem":"18.39", "vm":"1542.14"}
{"Name":"/usr/sbin/ofonod[760]", "cpu":"0.00","mem":"0.00", "vm":"0.00"}
{"Name":"/opt/networking/bin/network_manager[370]", "cpu":"0.20","mem":"53.43", "vm":"4225.69"}
{"Name":"/usr/bin/dmrouterd[913]", "cpu":"0.00","mem":"0.00", "vm":"0.00"}
我必须提取每个进程名称,但有些名称是单独出现,以及与它们相关的路径(我必须忽略这些路径),例如:pathology[876]
与/opt/pathology/bin/pathology[876]
是相同的。 我必须将此进程概括为路径的进程名。 如何在最后的/
和字符串末尾之间获取所需的字符串?
到目前为止,我已经计算了以下处理路径的正则表达式:/opt/
提取bin/之后的部分,但是当路径较长时会出现问题,例如/opt/
我得到的是pat/pathology[876]
,而我只想要pathology[876]
。
"(Name)":("\/opt\/(.*?)\/bin\/(.*?)"|"(.*?)")
我创建这样的正则表达式的步骤是:
([^/“]+)
([^“\/]+\/)*
,要捕获第一个/并使其可选,我们只需将其扩展为(\/([^”\/]+\/)*)?
最终的正则表达式可以是:
"Name":"(?:\/(?:[^"\/]+\/)*)?([^/\"]+)"
(请注意,语法(?:X)
将对表达式X进行分组,但不会被捕获为“结果组”)
我在这里测试并保存了这个正则表达式:https://regex101.com/r/wnsnk/2
这个可以帮你:
[^\/"]+(?=", "cpu")
英文:
在每行中,查找“,”cpu“
前不是正斜杠或双引号的所有内容
https://regex101.com/r/u3rhuf/1/