提问者:小点点

如何用正则表达式/Java提取某个字符后的字符串末尾?


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/提取bin/之后的部分,但是当路径较长时会出现问题,例如/opt//bin/pat/pathology[876]我得到的是pat/pathology[876],而我只想要pathology[876]

"(Name)":("\/opt\/(.*?)\/bin\/(.*?)"|"(.*?)")

共2个答案

匿名用户

我创建这样的正则表达式的步骤是:

  1. 正在考虑哪些字符(不)包含在我的目标字符串中? 在这种情况下,允许使用所有字符,但不允许使用“和/”:([^/“]+)
  2. 在我的目标字符串之前写了什么? 在本例中,一个像/。。。/。。。/这样的可选字符串总是以/开头和结尾。 要捕获所有的。。/。。/。。/我们可以编写([^“\/]+\/)*,要捕获第一个/并使其可选,我们只需将其扩展为(\/([^”\/]+\/)*)?
  3. 我的目标字符串后面写什么? ->; “

最终的正则表达式可以是:

"Name":"(?:\/(?:[^"\/]+\/)*)?([^/\"]+)"

(请注意,语法(?:X)将对表达式X进行分组,但不会被捕获为“结果组”)

我在这里测试并保存了这个正则表达式:https://regex101.com/r/wnsnk/2

匿名用户

这个可以帮你:

[^\/"]+(?=", "cpu")

英文:

在每行中,查找“,”cpu“前不是正斜杠或双引号的所有内容

https://regex101.com/r/u3rhuf/1/