我需要一个正则表达式,允许我在c#中分割以下字符串:
$ 1.89 BROWN RICE - 16 03/01 - 03/07 1.29
这样的事情:
使用Regex可以实现这一目标吗?
答案 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+)
匹配第二个价格
我注意到示例中的减号(-
)使用不同的字符代码作为标准减号。因此,我的正则表达式不想工作,直到我用正常的替换你的“ - ”。