У меня есть строка вида:
codename123
Существует ли регулярное выражение, которое можно использовать с Regex.Split(), чтобы разбить буквенную часть и числовую часть надвухэлементный массив строк?
Regex.Split()
Я знаю, что вы запросили метод Split, но в качестве альтернативы вы можете использовать именованные группы захвата:
Split
var numAlpha = new Regex("(?<Alpha>[a-zA-Z]*)(?<Numeric>[0-9]*)"); var match = numAlpha.Match("codename123"); var alpha = match.Groups["Alpha"].Value; var num = match.Groups["Numeric"].Value;
splitArray = Regex.Split("codename123", @"(?<=\p{L})(?=\p{N})");
будет разделен между буквой Unicode и цифрой Unicode.
Regex немного тяжеловат для этого, если ваша строка всегда имеет такую форму. Вы можете использовать
"codename123".IndexOfAny(new char[] {'1','2','3','4','5','6','7','8','9','0'})
и два вызова Substring.
ИМО, было бы намного проще найти совпадения, например:
Regex.Matches("codename123", @"[a-zA-Z]+|\d+") .Cast<Match>() .Select(m => m.Value) .ToArray();
, а не использовать Regex.Split.
Regex.Split
Немного многословно, но
Regex.Split( "codename123", @"(?<=[a-zA-Z])(?=\d)" );
Можете ли вы быть более точным в своих требованиях? Может быть, несколько других примеров ввода.
Ну, только в одну строку: Regex.Split("codename123", "^([a-z]+)");
Regex.Split("codename123", "^([a-z]+)");
Еще один более простой способ -
string originalstring = "codename123"; string alphabets = string.empty; string numbers = string.empty; foreach (char item in mainstring) { if (Char.IsLetter(item)) alphabets += item; if (Char.IsNumber(item)) numbers += item; }
этот код написан на Java / логика должна быть такой же в других местах
public String splitStringAndNumber(String string) { String pattern = "(?<Alpha>[a-zA-Z]*)(?<Numeric>[0-9]*)"; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(string); if (m.find()) { return (m.group(1) + " " + m.group(2)); } return ""; }