【问题标题】:Remove all occurences of several characters from a string从字符串中删除所有出现的多个字符
【发布时间】:2015-11-23 16:49:13
【问题描述】:

所以我有一个包含数字、字母和符号的字符串,如下所示:

AD 123 (+45) AS 6.7(+8%)

我想要List<double> 中的所有数字。为此,我首先要删除所有出现的'(', ')', '+''%'
我目前的方法是 string.Replace() 方法,但看起来有点脏:

stats = stats.Replace("(", "").Replace(")", "").Replace("%", "").Replace("+", "");

还有其他的想法吗?我不想只写有效的代码,我希望它优雅。

【问题讨论】:

  • 您期望的结果究竟是什么?例如,您想要一个包含数字 123、45、6.7 和 8 的列表吗?
  • @Wilsu 您能否根据Habib 的回答向我们展示预期的结果应该是什么,我认为这可能是您正在寻找的......
  • 我想要的正是我所说的:我想要双精度类型列表中的所有数字。我使用上面的代码删除了提到的符号,然后在空格处拆分字符串并迭代我得到的数组。对于我使用 TryParse 的每个项目,如果成功,我将结果添加到列表中。没有想到正则表达式。

标签: c# string coding-style


【解决方案1】:

通常我选择框架解决方案而不是正则表达式,但在您的情况下,正则表达式是最“优雅”的解决方案:

var str = "AD 123 (+45) AS 6.7(+8%)";

var doubles = new List<double>();
foreach (var item in Regex.Matches(str, @"(\d|\.)+"))
{
    doubles.Add(double.Parse(item.ToString()));
}

//doubles = [123, 45, 6.7, 8] 

我使用了(\d|\.)+,它匹配任何数字或点。适用于您当前的输入。

【讨论】:

  • @Wilsu 当然可以。老实说,我不知道你为什么投票这么差。你提出了一个问题并尝试了一个解决方案。似乎人们有时只是看到-2 并赶上潮流。
  • 其实我并不在乎。我来这里是为了信息,而不是声誉。
【解决方案2】:

您可以循环检查字符是数字还是小数分隔符,并跟踪每个数字的开头和结尾。

string stuff = "AD 123 (+45) AS 6.7(+8%)";

List<double> numbers = new List<double>();

int numberStart = -1;
for (int i = 0; i < stuff.Length; i++)
{
    if (char.IsDigit(stuff[i])
        || stuff[i].ToString() == CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)
    {
        if (numberStart == -1)
        {
            numberStart = i;
        }
    }
    else
    {
        if (numberStart != -1)
        {
            numbers.Add(double.Parse(stuff.Substring(numberStart, i - numberStart)));
        }
        numberStart = -1;
    }
}

if (numberStart != -1)
{
    numbers.Add(double.Parse(stuff.Substring(numberStart)));
}

Console.WriteLine(string.Join(",", numbers));

会输出

123,45,6.7,8

这里唯一的问题是它没有处理多个小数分隔符或千位分隔符的可能性。

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2021-01-28
    相关资源
    最近更新 更多