0

这是处理这个问题的正确方法吗?

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");

有没有更简洁的方法?实际上,我没有正确抓住该项目。基本上,我想获取商品和价格。

4

4 回答 4

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();
于 2012-09-09T05:08:32.177 回答
1
([a-zA-Z\s]+).*?(\d*\.\d{2})  //item in group 1, price in group 2

*不区分大小写,匹配 0.93 或 11.93 的价格(小数点前的数字是可选的),也将匹配更奇怪的字符串,如“Strawb bana-11.98”

更新:匹配带有数字的项目:

([\w\s]+?).?(\d*\.\d{2}) //matches 'item42 Bananas .55'

(显然,您可以继续构思输入并使模式逐渐变得更加复杂,但也许我应该去睡觉了 :)

于 2012-09-09T05:37:59.640 回答
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 位或更多位”的意思

于 2012-09-09T05:08:30.710 回答
-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) 将匹配的子表达式捕获到命名组中。

于 2012-09-09T12:58:18.890 回答