正则表达式提取最后一个冒号后没有空格且完全匹配的第一个单词

问题描述

我必须对最后一个冒号之后和空格之间的单词进行完全匹配。例如在下面的句子

XYZ Cloud : ABC : Windows : Non Prod : Silver : ABC123XYZ : ABCdef Service is Down

这里我必须为ABCdef做全匹配。 ([^:.*\s]+$) 返回 Down([^:]+$) 返回“ABCdef Service is Down”作为完全匹配。但是我正在寻找 ABCdef 作为完全匹配。

解决方法

您可以匹配到最后一次出现 :,然后匹配一个空格并捕获第 1 组中的 1+ 个非空格字符。

^.*: +(\S+)

说明

  • ^ 字符串开头
  • .*: + 尽可能匹配除换行符外的任何字符,后跟 1 个或多个空格
  • (\S+) 捕获组 1,匹配 1+ 次非空白字符后跟一个空格

Regex demo

仅对于匹配,您可能会使用积极的环视:

(?<=: )[^\s:]+(?=[^\r\n:]*$)

说明

  • (?<=: ) 正向后视,断言直接在左边的是`:
  • [^\s:]+ 匹配 1+ 次除空白字符或 :
  • 之外的任何字符
  • (?=[^\r\n:]*$) 正向前瞻,断言右边的内容 0+ 次除换行符或 : 以外的任何字符,并断言字符串的结尾。

Regex demo

,

使用 C#,这是有效的:

var text = @"XYZ Cloud : ABC : Windows : Non Prod : Silver : ABC123XYZ : ABCdef Service is Down";
var regex = new Regex(@":(?!.*:)\s(.+?)\s.*$");

Console.WriteLine(regex.Match(text).Groups[1].Value);

我明白了:

ABCdef
,

我认为最简单的[ ]*([^: ]*)[^:]*$

  • [ ]*:任意数量的空格
  • ([^: ]*):目标非空格词组,没有冒号
  • [^:]*$:不带冒号的其余行

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


要访问您要查找的词,请使用组 1。