仅提取混合字母数字字符串中的数字

时间:2017-01-26 08:35:59

标签: c# regex

我想使用正则表达式从表示混合字母句子的字符串中提取一系列数字。

示例:

"Please buy 40 kg of apples for 1350$ each"                  --> "40|1350"
"Please call 8 0 0 4 3 2 1 2 4 3 from 17:00 till 22:00"      --> "8004321243|1700|2200"
"I would like to bid 50 euro on 20 black and pair of spades" --> "50|20"

因此,只有数字提取,并且其间的任何单词都被截断为|分隔符。如果数字由非单词字符分隔,则认为它们与第二个示例中的数字相同。

3 个答案:

答案 0 :(得分:1)

您可以先尝试搜索数字后跟数字加上非字母字符,然后清理正则表达式匹配:

var str = "Please call 8 0 0 4 3 2 1 2 4 3 from 17:00 till 22:00";

var regex1 = new Regex(@"([\d]+[\d\W]*)");
var regex2 = new Regex(@"([\W]+)");    

foreach (var match in regex1.Matches(str).Cast<Match>())
{
    var val = match.Groups[1].Value;    

    foreach (var nonWordMatch in regex2.Matches(val).Cast<Match>())
    {
        val = val.Replace(nonWordMatch.Value, "");
    }

    var number = Int64.Parse(val);
    Console.WriteLine(">> num " + number);
}

答案 1 :(得分:0)

StringBuilder number = new StringBuilder();
List<string> test = new List<string>();

foreach (char c in s)
    {
        if (Char.IsDigit(c)) {
           number.append(c);
        }
        else if (c == ' ' || c == ':') {
          //donnothing
        }
        else {
           if (number.Length > 0) {
           test.add(number.ToString());
           number.Clear();
           }
        }
    }

答案 2 :(得分:0)

删除所有带有Regex.Replace(s, @"\W+", "")的非单词字符,然后使用简单的\d+模式提取所有数字块:

var res = Regex.Matches(Regex.Replace(s, @"\W+", ""), @"\d+")
       .Cast<Match>()
       .Select(m=>m.Value)
       .ToList();

请参阅C# demo