我有一些字符串:“7d”,“5m”,“95d”等。
我需要找到一种简单的方法来分别获得整数和char。
我怎样才能做到这一点:
int number = GetNumber("95d"); //should return 95
char code = GetCode("95d"); // should return d
答案 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"));