如何在这样一个简单的字符串中单独获取整数和字符?

时间:2011-10-03 17:23:17

标签: c# .net regex string parsing

我有一些字符串:“7d”,“5m”,“95d”等。

我需要找到一种简单的方法来分别获得整数和char。

我怎样才能做到这一点:

int number = GetNumber("95d"); //should return 95
char code = GetCode("95d"); // should return d

8 个答案:

答案 0 :(得分:5)

这些是表达式:

[^\d]+ <- not digit
\d+ <- digits

<小时/> EDIT

    static int GetNumber(string text)
    {
        string pat = @"\d+";
        int output;
        // Instantiate the regular expression object.
        Regex r = new Regex(pat, RegexOptions.IgnoreCase);
        Match m = r.Match(text);
        if (int.TryParse(m.Value, out output))
            return output;
        else
            return int.MinValue; // something unlikely
    }

    static char GetChar(string text)
    {
        string pat = @"[^\d]";
        int output;
        // Instantiate the regular expression object.
        Regex r = new Regex(pat, RegexOptions.IgnoreCase);
        Match m = r.Match(text);
        return m.Value.Length == 1 ? m.Value[0] : '\0';
    }

您实际上只需要创建一次RegExp对象,而不是每次方法调用。

答案 1 :(得分:4)

RegEx解决方案的简单替代方案。

string letters = Seperate( "95d",  c => Char.IsLetter( c ) );
string numbers = Seperate( "95d", c => Char.IsNumber( c ) );

static string Seperate( string input, Func<char,bool> p )
{
    return new String( input.ToCharArray().Where( p ).ToArray() );
}

你可以对字符串进行“分离”扩展方法,使事情变得更清晰。

答案 2 :(得分:3)

string s = "95d";
int number = Int32.Parse(s.Substring(0, s.Length - 1));
char code = Char.Parse(s.Substring(s.Length - 1));

答案 3 :(得分:2)

正则表达式可能有点过分 - 您证明的示例具有非常简单,一致的格式。尝试以下功能作为起点:

public int GetNumber(string input)
{
   return int.Parse(input.Substring(0, input.Length - 1));
}


public char GetCode(string input)
{
   return input.Last();
}

我说“作为一个起点”,因为你需要考虑边缘情况 - 你将如何处理空字符串?字符串是否可以以多个字母结尾,如果是,您将如何处理?希望这些例子让车轮转动。

答案 4 :(得分:2)

    private char GetChar(string t)
    {
        return t.Substring(t.Length - 1, 1)[0];
    }

    private int GetNumber(string t)
    {
        return Int32.Parse(t.Substring(0, t.Length - 1));
    }

编辑:GetNumber函数的第二个版本,使用'TryParse'而不是'Parse':

    private int GetNumber(string t)
    {
        int result;
        if(Int32.TryParse(t.Substring(0, t.Length - 1), out result) == false)
        {
             // you can handle here incorrect 't' value if you want
        }
        return result;
    }

答案 5 :(得分:2)

public int GetNumber(string input)
{
    string result = "";

    foreach (Char c in input)
    {
        if (Char.IsDigit(c))
            result += c;
    }

    return Convert.ToInt32(result);
}

public string GetCode(string input)
{
    string result = "";

    foreach (Char c in input)
    {
        if (!Char.IsDigit(c))
            result += c;     // or return the char if you want only the first one.
    }

    return result;
}

没有测试,但对我而言,这似乎是实现这一目标的最佳方式。与其他答案相比,它也是提供最大灵活性的方法。

答案 6 :(得分:1)

你走了:

public class NumberSuffixParser
{
    private static readonly Regex rxPattern = new Regex( @"^(?<number>\d+(\.\d+)?)(?<suffix>\p{L}+)$" , RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture ) ;

    public void Parse( string value , out decimal number , out string suffix )
    {
        if ( value == null ) throw new ArgumentNullException("value") ;
        Match match = rxPattern.Match( value ) ;
        if ( ! match.Success ) throw new ArgumentOutOfRangeException("value") ;
        number = decimal.Parse( match.Groups["number"].Value ) ;
        suffix =                match.Groups["suffix"].Value   ;
        return ;
    }

    public decimal ParseNumber( string value )
    {
        decimal number ;
        string  suffix ;
        Parse( value , out number , out suffix ) ;
        return number ;
    }

    public string ParseSuffix( string value )
    {
        decimal number ;
        string  suffix ;
        Parse( value , out number , out suffix ) ;
        return suffix ;
    }

}

另一个稍微简化但相当灵活的方法如下。它会愉快地解析像'789xyz','1234'或'abcde'这样的东西。如果它没有找到整数前缀,则返回0.后缀是整数前缀后面的内容:如果找不到后缀,则返回nil('')。

public static void Parse( string value , out int number , out string suffix )
{
  number = 0 ;
  int i = 0 ;
  for ( i = 0 ; i < value.Length && char.IsDigit( value[i] ) ; ++i )
  {
     number *= 10 ;
     number += ( value[i] - '0' ) ;
  }
  suffix = value.Substring(i) ;
  return ;
}

答案 7 :(得分:0)

您可以尝试这样的事情:

static string getNumber(String str)
{
    StringBuilder sb = new StringBuilder();
    foreach (char chr in str)
    {
        try
        {
            int x = int.Parse(chr.ToString());
            sb.Append(chr);
        } catch (Exception ex) {
            return sb.ToString();
        }
    }

    return null;
}

static string getCode(String str)
{
    StringBuilder sb = new StringBuilder();
    foreach (char chr in str)
    {
        try
        {
            int x = int.Parse(chr.ToString());
        }
        catch (Exception ex)
        {
            sb.Append(chr);
        }
    }

    return sb.ToString();
}



// 95
Console.WriteLine(getNumber("95d"));
// a
Console.WriteLine(getCode("95d"));