在忽略字符串数字组合的同时提取特定字符之间的唯一数字值

时间:2014-06-18 06:58:44

标签: c# regex

我有这个字符串,

|SomeText1|123|0#$0#62|SomeText2|456|6#83|SomeText3#61|SomeText1#41|SomeText5#62|SomeText3#82|SomeText9#40|SomeText2#$1#166|SomeText2|999|7#146|SomeText2#167|SomeText2#166|

我想只提取数字值并将它们添加到列表中,然后将它们相加。这意味着价值,

|123|,|456|, |999|

所有其他值,例如,

|SomeText1|,|SomeText2|,|SomeText2#$1#166|

不应该在列表中。

我正在使用C#。我尝试了类似的东西,

int sum = 0;

List<int> results = new List<int>();

Regex regexObj = new Regex(@"\|(.*?)\|");
Match matchResults = regexObj.Match(s);
while (matchResults.Success)
{
    results.Add(Convert.ToInt32(matchResults));
    matchResults = matchResults.NextMatch();
}

for (int i = 0; i < results.Count; i++)
{
    int bonusValues = results[i];
    sum = sum + bonusValues;
}

所以基本的想法是在| |个字符之间提取值并忽略一个不是纯数字的字符,如

|#16543TextBL#aBLa564B|

4 个答案:

答案 0 :(得分:2)

string input = @"|SomeText1|123|0#$0#62|SomeText2|456|6#83|SomeText3#61|SomeText1#41|SomeText5#62|SomeText3#82|SomeText9#40|SomeText2#$1#166|SomeText2|999|7#146|SomeText2#167|SomeText2#166|";

var numbers = Regex.Matches(input, @"\|(\d+)\|")
                   .Cast<Match>()
                   .Select(m => m.Groups[1].Value).ToList();

var sum = numbers.Sum(n => int.Parse(n));

答案 1 :(得分:1)

如果正则表达式没有明确要求,可以使用linq

stringName.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
          .Where(x => x.All(char.IsNumber)).ToList(); 

总和

stringName.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
          .Where(x => x.All(char.IsNumber)).Sum(x => int.Parse(x)); 

答案 2 :(得分:0)

你必须尝试下面的分期付款代码

Regex regexObj = new Regex(@"\d+");

\ d代表任何数字,+代表一个或多个。 如果你想捕获负数,你可以使用 - ?\ d +。

Regex regexObj = new Regex(@"-?\d+");

请注意,作为字符串,它应在C#中表示为&#34; \ d +&#34;,或@&#34; \ d +&#34;

答案 3 :(得分:-2)

如果您不需要特定的正则表达式,那么您可以轻松地将字符串拆分为:

string[] splits = s.split('|'); 

然后你可以循环遍历这组字符串并尝试将其解析为整数。我

for(int i=0; i<splits.size(); i++){
  int num;
  bool isNum = int.TryParse(splits[i], out num);
  if(isNum){
   list.add(num);
  }
}