这是处理此问题的正确方法吗?
string item = "strawb bana .93";
string itemPattern = @"\w*";
string pricePattern = @"\d*\.\d*";
var match = Regex.Match(item, itemPattern, RegexOptions.IgnoreCase);
var match2 = Regex.Match(item, pricePattern, RegexOptions.IgnoreCase);
if (match.Success & match2.Success)
{
Console.WriteLine("match");
Console.WriteLine(match.Value);
Console.WriteLine(match2.Value);
}
else
Console.WriteLine("no match");
或许有更简洁的方法吗?实际上,我没有正确地抓住这个项目。基本上,我想抓住物品和价格。
答案 0 :(得分:1)
只需将该行更改为此项即使它包含空格也应与您的项匹配:
string itemPattern = @"[a-z\s]*";
更新: 更好的方法是使用群组:
string item = "strawb bana as .93";
string itemPattern = @"([a-z\s]*)(\d*\.*\d*)";
var match = Regex.Match(item, itemPattern, RegexOptions.IgnoreCase);
if (match.Success)
{
Console.WriteLine("match");
Console.WriteLine("name: "+match.Groups[1].Value);
Console.WriteLine("Price: "+match.Groups[2].Value);
}
else
Console.WriteLine("no match");
Console.Read();
答案 1 :(得分:1)
([a-zA-Z\s]+).*?(\d*\.\d{2}) //item in group 1, price in group 2
*不区分大小写,匹配.93或11.93的价格(小数点前的数字是可选的),也会匹配像“Strawb bana-11.98”这样的较小的怪码字符串
已更新:匹配带有数字的项目:
([\w\s]+?).?(\d*\.\d{2}) //matches 'item42 Bananas .55'
(显然你可以继续梦想输入并使模式逐渐复杂化,但也许我应该去睡觉了:)
答案 2 :(得分:0)
你可能希望结合一个正则表达式并使用分组来捕获你想要的部分(检查我的C#,因为我不是C#开发人员!)
string item = "strawb bana .93";
string pattern = @"([a-z\s]+)(\d*\.\d{2})"
var match = Regex.Match(item,pattern,RegexOptions.IgnoreCase);
if( match.Success ) {
item_name = match.Groups[1].value;
price = match.Groups[2].value;
}
至于正则表达式本身:
([a-z\s]+)
匹配一个或多个(+号)字母或空格,并将其捕获为第1组
(\d*\.
启动第二组,并可选择匹配一个或多个数字,后跟句号
\d{2})
正好匹配两位数字并关闭第二组
编辑:对于C#如何解释?
,似乎存在一些分歧。我已将\d+?
更改为\d*
,这意味着“0位或更多位数”
答案 3 :(得分:-1)
试试这个正则表达式:
[\w\s]*\d*\.\d*
并使用Grouping constructs
,您的代码应如下所示:
string item = "strawb bana .93";
foreach(Match match in Regex.Matches(item, @"(?<str>[\w\s]*)(?<num>\d*\.\d+)"))
{
String str = match.Groups["str"].Value;
String nuum = match.Groups["num"].Value;
}
解释
<强> (?< name > subexpression)
强>
将匹配的子表达式捕获到命名组中。