Как получить первые числа из строки?
Пример: у меня есть "1567438absdg345"
Я хочу только получить "1567438" без "absdg345", я хочу, чтобы он был динамическим, получил первое появление индекса алфавита и удалил все после него.
Как получить первые числа из строки?
Пример: у меня есть "1567438absdg345"
Я хочу только получить "1567438" без "absdg345", я хочу, чтобы он был динамическим, получил первое появление индекса алфавита и удалил все после него.
Вы можете использовать методы расширения TakeWhile
для получения символов из строки, если они являются цифрами:
string input = "1567438absdg345";
string digits = new String(input.TakeWhile(Char.IsDigit).ToArray());
Подход Linq:
string input = "1567438absdg345";
string output = new string(input.TakeWhile(char.IsDigit).ToArray());
Или подход с регулярным выражением
String s = "1567438absdg345";
String result = Regex.Match(s, @"^\d+").ToString();
^
соответствует началу строки и \d+
следующие цифры
Вы можете прокручивать строку и проверять, является ли текущий символ числовым с помощью Char.isDigit
.
string str = "1567438absdg345";
string result = "";
for (int i = 0; i < str.Length; i++) // loop over the complete input
{
if (Char.IsDigit(str[i])) //check if the current char is digit
result += str[i];
else
break; //Stop the loop after the first character
}
забудьте регулярное выражение, создайте это как вспомогательную функцию где-нибудь...
string input = "1567438absdg345";
string result = "";
foreach(char c in input)
{
if(!Char.IsDigit(c))
{
break;
}
result += c;
}
Другой подход
private int GetFirstNum(string inp)
{
string final = "0"; //if there nothing, it'll return 0
foreach (char c in inp) //loop the string
{
try
{
Convert.ToInt32(c.ToString()); //if it can convert
final += c.ToString(); //add to final string
}
catch (FormatException) //if NaN
{
break; //break out of loop
}
}
return Convert.ToInt32(final); //return the int
}
Тест:
Response.Write(GetFirstNum("1567438absdg345") + "<br/>");
Response.Write(GetFirstNum("a1567438absdg345") + "<br/>");
Результат:
1567438
0
Старомодный регулярный экспрессионистский способ:
public long ParseInt(string str)
{
long val = 0;
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"^([\d]+).*$");
System.Text.RegularExpressions.Match match = reg.Match(str);
if (match != null) long.TryParse(match.Groups[1].Value, out val);
return val;
}
Если он не может разобрать, метод возвращает 0.
Пожалуйста, попробуйте
string val = "1567438absdg345";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[1-9][0-9]*");
string valNum = reg.Match(val).Value;
Таким образом, вы получите первую цифру из строки.
string stringResult = "";
bool digitFound = false;
foreach (var res in stringToTest)
{
if (digitFound && !Char.IsDigit(res))
break;
if (Char.IsDigit(res))
{
stringResult += res;
digitFound = true;
}
}
int? firstDigitInString = digitFound ? Convert.ToInt32(stringResult) : (int?)null;
Еще одна альтернатива, которая должна это сделать:
string[] numbers = Regex.Split(input, @"\D+");
Я не знаю, почему я получил пустую строку в результате в списке чисел выше, хотя?
Решено, как показано ниже, но, похоже, регулярное выражение должно быть улучшено, чтобы сделать это немедленно.
string[] numbers = Regex.Split(firstResult, @"\D+").Where(x => x != "").ToArray();