2013-05-10 191 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:」部分
- 分割字符串與字符串數組定界符逗號(,)
- 從所述陣列中的每個字符串獲取值

最好的解決方案不是代碼行數量較少的解決方案。這是任何稍後必須閱讀代碼的開發人員都可以理解的。