【问题标题】:string array to Int array using RegEx [closed]使用 RegEx 将字符串数组转换为 Int 数组 [关闭]
【发布时间】:2014-01-03 16:59:38
【问题描述】:

以下是我目前拥有的代码,但它没有按我的意愿工作,所以我需要一些帮助。

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

我想让这些数字以整数形式返回。

该函数返回一个列表,因为第一项 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);
    } 
}

【问题讨论】:

  • 你在问什么?你有什么问题?

标签: c# regex arrays string int


【解决方案1】:

如果您根据问题herehere 对问题String to HtmlDocument 的回答将HTML 加载到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()
                       ;

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

如果您想变得花哨,您可以检查当前的文化并使用定义的货币符号、千位分隔符和小数点即时构建正则表达式。如果您要使用负数,则正则表达式需要变得更漂亮一些,特别是如果它们通过括号括起来表示会计风格,但不是那么多。

【讨论】:

    【解决方案2】:

    如果您只想返回一个 int,它可能很简单,如下所示:

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

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

    【讨论】:

      【解决方案3】:

      我想通了。我非常接近。完成代码如下。

       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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        相关资源
        最近更新 更多