2013-05-10 190 views
-1

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

我需要从字符串 的问题是,该字符串可以采取许多形式等

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 
... 
... 
... 
提取 ř(ABC), ģ(DEF), (GHI)

正如你所看到的,有很多事情要考虑从这个字符串中提取这个rbg。

我试图使用LINQ,但是这将是一个烂摊子,我认为(这只是第一个“R”(红)):

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

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

谢谢。

+0

正如你正在寻找**高效的**方式,最好的机会,成为一名RegEx专家,我会说:-) – 2013-05-10 14:47:00

+0

'ABCDEFGHI'是数字正确的! – Anirudha 2013-05-10 14:47:10

+0

某些'string.Split'可能会在您的未来... – 2013-05-10 14:50:30

回答

1

幸运的是,需要对这只正则表达式expertship有限度的,所以不妨一试:

你需要知道什么:

  • ()封闭捕获组 - 从完全匹配,你将能够提取的单串
  • []围绕一组允许的字符
  • \.是一个句号(越狱,因为它以其他方式之外的特殊含义在[] 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来检索匹配的字符串。

+0

我不明白在哪里可以应用R,G,B组,并使用您给定的正则表达式来阅读。但谢谢你的信息:-) – Sebastien 2013-05-10 15:04:20

+0

@Sebastien:每个'([0-9] +)'就是这样一个组。用英语表示“包含一个或多个数字的捕获组”。所以,我得到的正则表达式寻找字面文本'RGB:',然后它需要第一个这样的组,然后是一个点,然后是另一系列的数字,然后是逗号,依此类推。每个捕获组都可通过“Group”实例访问,如消息末尾所述。 – 2013-05-10 15:08:19

+0

哦,非常感谢,我现在明白了。 – Sebastien 2013-05-10 15:11:45

1

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

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

您可以访问该组这样

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

是的,正则表达式将是理想的,但直到你了解到这一点,才能与你(和一般的开发人员)知道的一起工作。

把问题分解成较小的
- 删除“RGB:”部分
- 分割字符串与字符串数组定界符逗号(,)
- 从所述阵列中的每个字符串获取值

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