我需要一个正则表达式,让我分裂在C#以下字符串:分割串入组,正则表达式
$ 1.89糙米 - 16 03/01 - 03/07 1.29
弄成这个样子:
- 组1:糙米 - 16
- 组2:03/01 - 03/07
- 组3:1.29
是否有可能通过正则表达式来实现?
我需要一个正则表达式,让我分裂在C#以下字符串:分割串入组,正则表达式
$ 1.89糙米 - 16 03/01 - 03/07 1.29
弄成这个样子:
是否有可能通过正则表达式来实现?
在你的情况,我认为正则表达式会比分裂更好。
如果是原来的价格(产品 - 数量)(日期范围)(销售价格),你可以尝试像
\$?\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。您是否尝试过使用类似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#
(\$\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,})$/
组1:糙米 - 16
组2:03/01 - 03/07
第3组:1.29(还将匹配0.29和0.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+)
匹配 匹配第二个价格
我注意到,在您的例子减号(-
)使用不同的字符代码为标准减号。因此,我的正则表达式不想工作,直到我用正常的替换你的“ - ”。
是的,可能。你试过什么了? – DNA 2012-02-21 23:17:22
分裂的逻辑是什么? (和1.89美元发生了什么?)说,(价格标题 - 数量(?))(日期 - 日期)(价格)? – 2012-02-21 23:19:41
看起来像(原价)(标题) - (数量)(日期范围销售价格)(销售价格)给我。约翰,这是否准确? – 2012-02-21 23:22:35