2012-02-21 186 views
0

我需要一個正則表達式,讓我分裂在C#以下字符串:分割串入組,正則表達式

$ 1.89糙米 - 16 03/01 - 03/07 1.29

弄成這個樣子:

  • 組1:糙米 - 16
  • 組2:03/01 - 03/07
  • 組3:1.29

是否有可能通過正則表達式來實現?

+0

是的,可能。你試過什麼了? – DNA 2012-02-21 23:17:22

+0

分裂的邏輯是什麼? (和1.89美元發生了什麼?)說,(價格標題 - 數量(?))(日期 - 日期)(價格)? – 2012-02-21 23:19:41

+0

看起來像(原價)(標題) - (數量)(日期範圍銷售價格)(銷售價格)給我。約翰,這是否準確? – 2012-02-21 23:22:35

回答

1

在你的情況,我認爲正則表達式會比分裂更好。

如果是原來的價格(產品 - 數量)(日期範圍)(銷售價格),你可以嘗試像

\$?\d+\.\d{2} ([A-Za-z ]+- *\d+) +(\d{2}/\d{2} *- *\d{2}/\d{2}) +\$?(\d+\.\d{2}) 

標題&數量在拍攝第1組,日期範圍內第2組,新組3中的價格。

說明:

  • \$?\d+\.\d{2}:價格,可選的美元符號,正好兩位小數(爲美分)。如果你想允許'$ 1'(即沒有小數位),那麼相應地修改。
  • ([A-Za-z ]+- *\d+)對象名稱和數量(用連字符分隔)。你可能希望修改這個正則表達式,這取決於你將得到的預期名字(也許它們不僅僅由字母和空格組成)。
  • (\d{2}/\d{2} *- *\d{2}/\d{2})日期範圍。我不知道你的是月/日還是日/月,但根據你的意願,如果你願意,你可以使你的正則表達式更獨特(例如,數字日期是([012]\d|3[01]),一個月只能從1到12) 。
  • \$?(\d+\.\d{2}) saleprice。
1

您是否嘗試過使用類似regexpal的東西?使您可以輕鬆測試如何過濾您感興趣的數據。右上方有一堆提示,它基本上描述瞭如何編寫正則表達式...

首先我們要捕獲價格,但我們不」關心它,因此?忽略組:

(.*) 

(?:\$\d+\.\d+) 

因爲我們知道第三部分應該是什麼樣子,我們感興趣的第一部分可以在中間吞噬什麼

接下來我們要匹配那個日期r安格:

(\d{2}/\d{2} ‐ \d{2}/\d{2}) 

最後我們希望有一個浮點數:

(\d+\.\d+) 

所以在最後,這樣的事情應該工作:

(?:\$\d+\.\d+) (.*) (\d{2}/\d{2} ‐ \d{2}/\d{2}) (\d+\.\d+) 

你需要躲避反斜槓包括在C#

0
(\$\d\.\d{2}) (.*?) (\d{2}/\d{2} - \d{2}/\d{2}) (.*) 

這適用於你的例子。它可能需要改善,如果您有任何更多的數據變化

(\$\d\.\d{2}) - Match the price $0.00 
    - If prices can be more than $9 then you'd need to 
    make this match one or more (\$\d+\.\d{2}) 
(.*?) - Lazy match everything till the next group 
(\d{2}/\d{2} - \d{2}/\d{2}) - Match the date range 
(.*) - Match what ever is left 

您也不妨把起始和終止行限制,如果你從一個文本文件中讀取這些一堆。

0
/^\$\d*\.\d{2,}\s([^-]+\s[-]\s\d+)\s(\d{2}\/\d{2}\s[-]\s\d{2}\/\d{2})\s(\d*\.\d{2,})$/ 

組1:糙米 - 16
組2:03/01 - 03/07
第3組:1.29(還將匹配0.29和0.29)

0

嘗試

 
    (\$\d+\.\d+)\s(.*?)\s(\d{2}/\d{2}\s-\s\d{2}/\d{2})\s(\d+\.\d+) 

(\$\d+\.\d+)  在美元的價格相匹配

  (.*?)                            產品名

(\d{2}/\d{2}\s-\s\d{2}/\d{2})匹配的時間範圍

  (\d+\.\d+)    匹配 匹配第二個價格


我注意到,在您的例子減號(-)使用不同的字符代碼爲標準減號。因此,我的正則表達式不想工作,直到我用正常的替換你的「 - 」。