如何从字符串中分离字符和数字部分

例如,我想分开:

  • OS234OS234
  • AA4230AA4230

我使用了以下简单的解决方案,但我确信应该有一个更有效和更强大的解决方案。

 private void demo() { string cell="ABCD4321"; int a = getIndexofNumber(cell); string Numberpart = cell.Substring(a, cell.Length - a); row = Convert.ToInt32(rowpart); string Stringpart = cell.Substring(0, a); } private int getIndexofNumber(string cell) { int a = -1, indexofNum = 10000; a = cell.IndexOf("0"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("1"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("2"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("3"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("4"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("5"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("6"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("7"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("8"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } a = cell.IndexOf("9"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } if (indexofNum != 10000) { return indexofNum; } else { return 0; } } 

正则表达式最适合这种工作:

 using System.Text.RegularExpressions; Regex re = new Regex(@"([a-zA-Z]+)(\d+)"); Match result = re.Match(input); string alphaPart = result.Groups[1].Value; string numberPart = result.Groups[2].Value; 

使用Linq来做到这一点

 string str = "OS234"; var digits = from c in str select c where Char.IsDigit(c); var alphas = from c in str select c where !Char.IsDigit(c); 

每个人和他们的母亲都会使用正则表达式给你一个解决方案,所以这里有一个不是:

  // s is string of form ([A-Za-z])*([0-9])* ; char added int index = s.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }); string chars = s.Substring(0, index); int num = Int32.Parse(s.Substring(index)); 

如果您想要解决更多出现的char后跟数字,反之亦然,您可以使用

 private string SplitCharsAndNums(string text) { var sb = new StringBuilder(); for (var i = 0; i < text.Length - 1; i++) { if ((char.IsLetter(text[i]) && char.IsDigit(text[i+1])) || (char.IsDigit(text[i]) && char.IsLetter(text[i+1]))) { sb.Append(text[i]); sb.Append(" "); } else { sb.Append(text[i]); } } sb.Append(text[text.Length-1]); return sb.ToString(); } 

然后

 var text = SplitCharsAndNums("asd1 asas4gr5 6ssfd"); var tokens = text.Split(' '); 

我真的很喜欢杰森的回答 。 我们这里不需要正则表达式。 我处理“H1N1”输入的解决方案:

 public static IEnumerable SplitAlpha(string input) { var words = new List { string.Empty }; for (var i = 0; i < input.Length; i++) { words[words.Count-1] += input[i]; if (i + 1 < input.Length && char.IsLetter(input[i]) != char.IsLetter(input[i + 1])) { words.Add(string.Empty); } } return words; } 

该解决方案是线性的(O(n))。

输出中

 "H1N1" -> ["H", "1", "N", "1"] "H" -> ["H"] "GH1N12" -> ["GH", "1", "N", "12"] "OS234" -> ["OS", "234"] 

你这样做是为了分类吗? 如果是这样,请记住,正则表达式可以杀死大型列表的性能。 我经常使用AlphanumComparer ,它是这个问题的一般解决方案(可以按任何顺序处理任何字母和数字序列)。 我相信我从这个页面改编了它。

即使你没有对它进行排序,使用逐字符方法(如果你有可变长度)或简单的子串/解析(如果它们已经修复)将比正则表达式更高效,更容易测试。

我使用了bniwredyc的答案来获得我日常工作的改进版本:

  private void demo() { string cell = "ABCD4321"; int row, a = getIndexofNumber(cell); string Numberpart = cell.Substring(a, cell.Length - a); row = Convert.ToInt32(Numberpart); string Stringpart = cell.Substring(0, a); } private int getIndexofNumber(string cell) { int indexofNum=-1; foreach (char c in cell) { indexofNum++; if (Char.IsDigit(c)) { return indexofNum; } } return indexofNum; } 

.NET 2.0兼容,没有正则表达式

 public class Result { private string _StringPart; public string StringPart { get { return _StringPart; } } private int _IntPart; public int IntPart { get { return _IntPart; } } public Result(string stringPart, int intPart) { _StringPart = stringPart; _IntPart = intPart; } } class Program { public static Result GetResult(string source) { string stringPart = String.Empty; int intPart; var buffer = new StringBuilder(); foreach (char c in source) { if (Char.IsDigit(c)) { if (stringPart == String.Empty) { stringPart = buffer.ToString(); buffer.Remove(0, buffer.Length); } } buffer.Append(c); } if (!int.TryParse(buffer.ToString(), out intPart)) { return null; } return new Result(stringPart, intPart); } static void Main(string[] args) { Result result = GetResult("OS234"); Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart); result = GetResult("AA4230 "); Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart); result = GetResult("ABCD4321"); Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart); Console.ReadKey(); } } 

只需使用substring函数并在括号内设置位置即可。

  String id = "DON123"; System.out.println("Id nubmer is : "+id.substring(3,6)); 

回答:

  Id number is: 123 

使用Split从使用tab \ t和space的sting中分隔字符串

 string s = "sometext\tsometext\tsometext"; string[] split = s.Split('\t'); 

现在你有一个你想要的字符串数组太容易了