6

我有一个包含此文本的字符串...

BEGIN Fin Bal -461.000 第 4 天 END

BEGIN Fin Bal 88861.000 第 2 天结束

BEGIN Fin Bal 456461.000 第一天结束

BEGIN Fin Bal -44561.000 Day 0 END

我需要提取价值

-461.000

包括是否为负。

我一直在用这个...

static string ExtractNumbers(string expr)
{
    //removes all text from string
    return string.Join(null, System.Text.RegularExpressions
                 .Regex.Split(expr, "[^\\d]"));
}

问题是这删除了负号并保留了 4 的日期值。

有没有办法有效地获取单词 Bal 之后的数值?在想要的值之后排除任何文本?

谢谢,保罗。

4

5 回答 5

3

对于获取第一个数字的 LINQ 解决方案:

string str = "BEGIN Fin Bal -461.000 Day 4 END";
decimal d;
string n = str.Split(' ').Where(s => decimal.TryParse(s, out d)).FirstOrDefault();
Console.WriteLine(n == null ? "(none)" : decimal.Parse(n).ToString());
于 2012-10-11T15:31:51.810 回答
2

试试这个,它可能对你有帮助

(?<=Bal\s)-?\d+\.\d+

参见Lookahead 和 Lookbehind 零宽度断言

解释

Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) «(?<=Bal\s)»
   Match the characters “Bal” literally «Bal»
   Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s»
Match the character “-” literally «-?»
   Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
Match a single digit 0..9 «\d+»
   Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the character “.” literally «\.»
Match a single digit 0..9 «\d+»
   Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»

在此处输入图像描述

于 2012-10-11T15:23:48.847 回答
0

你可以使用这个正则表达式:

^([^\d]*?)(-?[0-9.]+).*$

里面System.Text.RegularExpressions.Regex.Match()

于 2012-10-11T15:23:27.933 回答
0

对于正则表达式,请尝试以下操作,并获得第一个捕获:

/Bal (-?\d*?\.?\d*?)/

但是,如果您的文本始终采用“blah blah Bal NUMBER Day blah blah”的格式,那么:

str.Split(new string[] {"Bal ", " Day"})[1]
于 2012-10-11T15:28:42.227 回答
0

RedFilter 的回答既好又紧凑,但 LINQ 在这里并不是一种非常有效的方法:它会在到达您的号码之前经过“BEGIN”、“Fin”和“Bal”。另请注意,RedFilter 的方法同时使用 TryParseParse 进行相同的操作(我知道这是 LINQ 工作方式的副作用,但在我看来这是额外的开销)。如果它总是在你的字符串中的第四个项目,你可以尝试类似的东西:

 string val = "BEGIN Fin Bal -461.000 Day 4 END"; 
 float FinBal;
 bool success = float.TryParse(val.Split(' ')[3], NumberStyles.Float, new NumberFormatInfo(), out FinBal);
 if (success)
 {
     Console.WriteLine( "{0:F3}",FinBal);
 }
于 2012-10-11T15:46:19.770 回答