如何从字符串中分离字符和数字部分
例如,我想分开:
-
OS234
到OS
和234
-
AA4230
至AA
和4230
我使用了以下简单的解决方案,但我确信应该有一个更有效和更强大的解决方案。
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');
现在你有一个你想要的字符串数组太容易了