正则表达式匹配所有字符直到到达字符,但也包括最后一个匹配
Posted
技术标签:
【中文标题】正则表达式匹配所有字符直到到达字符,但也包括最后一个匹配【英文标题】:Regex Match all characters until reach character, but also include last match 【发布时间】:2019-04-17 20:52:11 【问题描述】:我正在尝试使用正则表达式查找所有颜色十六进制代码。
例如,我有这个字符串值 - #FF0000FF#0038FFFF#51FF00FF#F400FFFF
,我使用这个:
#.+?(?=#)
匹配所有字符的模式,直到到达#
,但它在最后一个字符处停止,这应该是最后一个匹配项。
我对这个正则表达式的东西有点陌生。我怎么也能得到最后一场比赛?
【问题讨论】:
#[0-9A-Fa-f]8
怎么样?
【参考方案1】:
您的正则表达式与最后一个值不匹配,因为您的正则表达式(带有正向前瞻(?=#)
)要求在已使用的值之后出现#
,并且字符串末尾没有#
。
你可以使用
#[^#]+
见regex demo
[^#]
否定字符类匹配除 #
之外的任何字符(+
表示 1 次或多次出现)并且不需要 #
立即出现在当前匹配的值。
在 C# 中,您可以使用收集所有匹配项
var result = Regex.Matches(s, @"#[^#]+")
.Cast<Match>()
.Select(x => x.Value)
.ToList();
您可以使用更精确的模式#[A-Fa-f0-9]8
,它匹配#
,然后匹配从a
到f
和A
到F
的任何8 个十六进制字符、数字或字母。
【讨论】:
我不会说完美,除非你想让它匹配#hello world
@UnknownUser 刚刚输入完毕。 @sln,OP帖子中没有这样的输入。无论如何,#[A-Fa-f0-9]8
涵盖了它。
所以您只依赖裁剪的样本?你和那个人。只需分裂 # 并拯救世界。
@sln 如果要拆分,那么应该是Regex.Split(s, @"(?=#)").Where(x => !string.IsNullOrWhiteSpace(x))
。不是在这里用#
分割那么简单。
我个人不使用拆分,所以,不,我不想拆分。感谢您的代码,但就像我说的,我不使用它。但如果我这样做了,我只会在# 上分裂。数组元素要么为空,要么不为空。【参考方案2】:
不要依赖 # 后面的任何字符,匹配十六进制字符就可以了 每次都会工作。
(?i)#[a-f0-9]+
【讨论】:
以上是关于正则表达式匹配所有字符直到到达字符,但也包括最后一个匹配的主要内容,如果未能解决你的问题,请参考以下文章