使用正则表达式将字符串拆分为组

时间:2012-02-21 23:15:39

标签: c# regex

我需要一个正则表达式,允许我在c#中分割以下字符串:

  

$ 1.89 BROWN RICE - 16 03/01 - 03/07 1.29

这样的事情:

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

使用Regex可以实现这一目标吗?

5 个答案:

答案 0 :(得分:1)

你有没有试过regexpal之类的东西?可以很容易地测试如何过滤您感兴趣的数据。右上角有一堆提示,基本上描述了如何编写正则表达式......

首先我们想要捕捉价格,但我们并不关心它,所以?忽略了该组:

(?:\$\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#

中的反斜杠

答案 1 :(得分: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})售价。

答案 2 :(得分: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

如果您正在从文本文件中读取大量这些内容,您可能还希望设置起始和终止行限制。

答案 3 :(得分: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和.29)

答案 4 :(得分: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+)匹配第二个价格


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