簡體   English   中英

使用正則表達式將字符串分成組

[英]Splitting string into groups with Regular Expression

我需要一個正則表達式,使我可以在c#中拆分以下字符串:

$ 1.89棕色大米‐ 16 03/01 ‐ 03/07 1.29

變成這樣的東西:

  • 組1:糙米-16
  • 第2組:03 / 01‐03 / 07
  • 組3: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM