正则表达式从行中获取2个字符串

时间:2012-09-09 05:00:29

标签: c# regex

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

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 个答案:

答案 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) 将匹配的子表达式捕获到命名组中。