从字符串中获取特定字符

时间:2013-05-10 14:44:08

标签: c# regex string linq split

我有很多字符串格式: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());

有更强大的高效方式吗?也许正则表达式可以做那件事,但我不是专家。任何帮助将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:1)

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

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

您可以像这样访问

 Regex.Match(input,regex).Groups["R"].Value;//Red value

答案 1 :(得分:1)

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

您需要了解的内容:

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

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

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

使用此功能调用Match methodRegex class

生成的Match实例有Groups property,其中应包含四个元素:

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

每个此类项目都是Group class的一个实例。使用其Value property检索匹配的字符串。

答案 2 :(得分:1)

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

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

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