使用RegEx将字符串数组转换为Int数组

时间:2014-01-03 16:59:39

标签: c# regex arrays string int

以下是我到目前为止所使用的代码,它不能按我的意愿工作,所以我需要一些帮助。

字符串[] FCVs带回字符串...每个看起来都像$103,700</td><t但有不同的数字。

我希望这些数字以整数形式返回。

该函数返回一个List,因为第一个项Description是一个字符串。

public static List<object> processPage(string sourceCode)
{
    List<object> ItemsToReturn = new List<object>();
    string Description = getBetween(sourceCode, @"Description:</td><td style=""padding-top: 5px; padding-bottom: 5px; font-size: 8pt; vertical-align: top;"">", "</td>");                        
    ItemsToReturn.Add(Description);

    string FullCashValue = getBetween(sourceCode, @"Full Cash Value</a>", "<a href");
    string[] FCVs = new string[2];
    int index1 = FullCashValue.IndexOf("$");
    FCVs[0] = FullCashValue.Substring(index1, 15).ToString(); //2014
    int index2 = FullCashValue.IndexOf("$", index1 + 1);
    FCVs[1] = FullCashValue.Substring(index2, 15).ToString(); //2013

    int[] int_FCVs;
    for (int i = 0; i < FCVs.Count(); i++)
    {               
        Match m = Regex.Match(FCVs[I], @"[+-]?\d*\.?\d+([Ee][+-]?\d+)?");
        int_FCVs[i] = m.Value;               
    }

    foreach (int FCV in int_FCVs)
    {
        ItemsToReturn.Add(FCV);
    } 
}

3 个答案:

答案 0 :(得分:1)

如果您根据问题herehere将HTML加载到HTMLDocument,问题String to HtmlDocument,您可能会发现从HTML中删除各种各样的碎片更简单}。或者,如果您知道HTML是有效的XML(不是给定的!),您只需将其加载到XmlDocument中即可。在任何一种情况下,您都可以使用XPath选择器轻松提取所需的各种内容。

但是,如果给定包含您所拥有的货币值的文本,我可能会编写一个小帮助方法来从文本中提取货币值:

public static IEnumerable<string> ParseCurrencyValuesFromString( this string s )
{
  for ( Match m = rxCurrencyValue.Match( s ) ; m.Success ; m.NextMatch() )
  {
    yield return m.Value ;
  }
}
private static Regex rxCurrencyValue = new Regex( @"\$\d\d?\d?(,\d\d\d)*(\.\d+)?");

正则表达式匹配文字$后跟一个1-3位组,后跟零或多个3位组,用逗号分隔,后跟一个可选的小数组件。例子:

  • $3
  • $32
  • $321
  • $3.97
  • $32,987.1234

一旦你拥有了它,它就是一个简单的Linq咒语来获得你想要的......

string text      = "$1, $2.34, $123, $1,234, $12,345, $123,456, $12,345,678.9012" ;
int[]  intValues = text.ParseCurrencyValuesFromString()
                       .Select( v => decimal.Parse(v,NumberStyles.Currency))
                       .Select( d => (int) Math.Round(d,MidpointRounding.ToEven))
                       .ToArray()
                       ;

让正则表达式引擎为您完成工作。

如果您想获得幻想,可以使用定义的货币符号,数千个分隔符和小数点来检查当前文化并动态构建正则表达式。如果你要有负数,那么正则表达式将需要得到一点点发言人,特别是如果它们通过括在括号中来表示会计风格,但不是那么多。

答案 1 :(得分:0)

如果您只想返回一个int,它可能就像下面这样简单:

int outputValue;
int.TryParse(Regex.Replace(inputString, @"[\D]", ""), out outputValue);

这将103700放入outputValue变量中。您需要对其进行扩展,并为没有数字的项目添加处理。

答案 2 :(得分:0)

我明白了。我很亲密。完成以下代码。

 public static List<object> processPage(string sourceCode)
{
            //create List<object> to return
            List<object> ItemsToReturn = new List<object>();
            string Description = getBetween(sourceCode, @"Description:</td><td style=""padding-top: 5px; padding-bottom: 5px; font-size: 8pt; vertical-align: top;"">", "</td>");
            //add description (string) to List<object>          
            ItemsToReturn.Add(Description);

            //pull section to sort through from sourcecode
            string FullCashValue = getBetween(sourceCode, @"Full Cash Value</a>", "<a href");
            string[] FCVs = new string[2];
            //find index of $ sign
            int index1 = FullCashValue.IndexOf("$");
            //find $ amount + some extra characters for wiggle room
            FCVs[0] = FullCashValue.Substring(index1, 15).ToString(); //2014
            int index2 = FullCashValue.IndexOf("$", index1 + 1);
            FCVs[1] = FullCashValue.Substring(index2, 15).ToString(); //2013

            int[] int_FCVs = new int[5];
            for (int i = 0; i < FCVs.Count(); i++)
            {
                // replace all non-digits with ""
                var m = Regex.Replace(FCVs[i], @"[^.0-9]", "");
                //convert var m to Int & place into array of ints
                int_FCVs[i] = Convert.ToInt32(m);                
            }
            //put each int into ItemsToReturn (list<object>)
            foreach (int FCV in int_FCVs)
            {
                ItemsToReturn.Add(FCV);
            } 

       return ItemsToReturn;
}