2012-02-21 188 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+)    匹配 匹配第二个价格


我注意到,在您的例子减号(-)使用不同的字符代码为标准减号。因此,我的正则表达式不想工作,直到我用正常的替换你的“ - ”。