[英]Splitting string into groups with Regular Expression
我需要一個正則表達式,使我可以在c#中拆分以下字符串:
$ 1.89棕色大米‐ 16 03/01 ‐ 03/07 1.29
變成這樣的東西:
使用Regex可以實現嗎?
您是否嘗試過使用正則表達式之類的東西 ? 輕松測試如何過濾您感興趣的數據。右上角有很多提示,它們基本上也描述了如何編寫正則表達式...
首先,我們要獲取價格,但我們不關心價格,所以?
忽略該組:
(?:\$\d+\.\d+)
由於我們知道第三部分應該是什么樣子,因此我們感興趣的第一部分可以吞噬中間的任何內容:
(.*)
接下來,我們要匹配該日期范圍:
(\d{2}/\d{2} ‐ \d{2}/\d{2})
最后,我們需要一個浮點數:
(\d+\.\d+)
因此,總而言之,這樣的事情應該起作用:
(?:\$\d+\.\d+) (.*) (\d{2}/\d{2} ‐ \d{2}/\d{2}) (\d+\.\d+)
您需要轉義反斜杠以將其包含在c#中
在您的情況下,我認為正則表達式比拆分更好。
如果是原始價格(產品-數量)(日期范圍)(銷售價格),則可以嘗試以下方法
\$?\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})
的售價。 (\$\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
如果您正在從文本文件中讀取大量約束,則還可能希望放置起始和結束行約束。
/^\$\d*\.\d{2,}\s([^-]+\s[-]\s\d+)\s(\d{2}\/\d{2}\s[-]\s\d{2}\/\d{2})\s(\d*\.\d{2,})$/
第一組:糙米-16
第2組:03 / 01‐03 / 07
第3組:1.29(也將匹配0.29和.29)
嘗試
(\$\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+)
與第二個價格匹配
我注意到示例中的減號( -
)使用不同的字符代碼作為標准減號。 因此,我的Regex不想工作,直到我用普通的替換您的“-”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.