-1

我有许多字符串格式: RGB:ABC.XX,DEF.XX,GHI.XX 其中 ABCDEFGHI 是数字。

我需要从该字符串中提取R (ABC)、G (DEF)、B (GHI) 问题是字符串可以采用多种形式,例如

RGB:AB.XX,DE.XX,GHI.XX
RGB:ABC.XX,DE.XX,GH.XX
RGB:ABC.XXX,DE.XX,GH.XX
RGB:ABC.XXX,DE.XX,GH.XX
...
...
...

如您所见,从该字符串中提取此 rbg 需要考虑很多事情。

我尝试使用 LINQ,但我认为那将是一团糟(这仅适用于第一个“R”(红色)):

rgb[0] = new String(rgbName.SkipWhile(x => char.IsLetter(x) || x == ':').TakeWhile(x => char.IsNumber(x)).ToArray());

有没有更有效的方法来做到这一点?也许正则表达式可以做那件事,但我不是专家。任何帮助将不胜感激。

谢谢。

4

3 回答 3

1

你可以试试这个正则表达式

.*?(?<R>\d+).*?(?<G>\d+).*?(?<B>\d+)

您可以像这样访问该组

 Regex.Match(input,regex).Groups["R"].Value;//Red value
于 2013-05-10T14:51:59.803 回答
1

幸运的是,只需要有限程度的正则表达式专业知识,所以试一试:

你需要知道的:

  • ()包含一个捕获组 - 从完整匹配中,您将能够将它们提取为单个字符串
  • []包含一组允许的字符
  • \.[]是句号(转义,因为它在 C# 的正则表达式实现之外具有特殊含义)
  • \通常用于转义特殊字符
  • +表示前面子表达式的一次或多次
  • ^$分别表示字符串的开头和结尾

考虑到这一点,您可以尝试以下正则表达式:

^RGB\:([0-9]+)\.[0-9]+\,([0-9]+)\.[0-9]+\,([0-9]+)\.[0-9]+$

使用它来调用Match方法Regex

生成的Match实例有一个Groups属性,它应该包含四个元素:

  • 完整匹配的字符串
  • R部分
  • G部分
  • B部分

每个这样的项目都是Group的一个实例。使用它的Value属性来检索匹配的字符串。

于 2013-05-10T14:57:19.353 回答
1

是的,正则表达式将是理想的,但在您了解这一点之前,请使用您(和普通开发人员)所知道的内容。

将问题分解为更小的问题
- 删除“RGB:”部分
- 将字符串拆分为一个字符串数组,用逗号 (,) 分隔
- 从数组中的每个字符串中获取值

最好的解决方案不是代码行数更少的解决方案。这是任何后来必须阅读您的代码的开发人员都可以理解的。

于 2013-05-10T15:01:17.147 回答