#c# #regex #string #substring
#c# #регулярное выражение #строка #подстрока
Вопрос:
Как вы можете написать функцию / регулярное выражение, которое дает вам первый блок символов первые числа, не разделенные пробелом, и опустить остальное? Вот несколько примеров того, как должен выглядеть результат с учетом разных строк («ввод» -> «результат»):
"abc 1" -> "abc 1"
"abc def 1" -> "abc def 1"
"abc-def 1" -> "abc-def 1"
"abc 1b" -> "abc 1"
"abc 11 b3" -> "abc 11"
"abc 11 3" -> "abc 11"
"abc 11b" -> "abc 11"
Комментарии:
1. может быть, это
[a-zA-Z]* d*
. или этоS* d*
2. Я только что проверил это, но я выбрал регулярное выражение для удобства чтения, спасибо.
Ответ №1:
Один из способов (слова состоят из a-z -)
Match match = Regex.Match(value, @"^([A-Za-z-] ) (d )");
if (match.Success)
{
var word = match.Groups[1].Value;
var num = match.Groups[2].Value;
}
Комментарии:
1. Вы не соответствовали второй строке. На самом деле так и должно быть
^([A-Za-z- ] ) (d )
.
Ответ №2:
class Program
{
static void Main(string[] args)
{
string[] Value = new string[] {
"abc 1",
"abc def 1",
"abc-def 1",
"abc 1b",
"abc 11 b3",
"abc 11 3",
"abc 11b"
};
foreach (string value in Value)
{
Match match = Regex.Match(value, @"^([A-Za-z-] ) (d )");
if (match.Success)
{
var word = match.Groups[1].Value;
var num = match.Groups[2].Value;
Console.WriteLine(word " " num);
}
}
}
}
//abc 1
//abc-def 1
//abc 1
//abc 11
//abc 11
//abc 11
Ответ №3:
Вот решение LINQ с использованием TakeWhile
SkipWhile
методов и . (Я протестировал все ваши записи, и это работает):
string str = "abc 11 3";
var result = string.Concat(string.Join("", str.TakeWhile(c => !char.IsDigit(c))),
string.Join("", str.SkipWhile(c => !char.IsDigit(c)).TakeWhile(char.IsDigit)));
Только не забудьте сначала добавить using System.Linq;
в свою using
директиву.
Ответ №4:
Это должно сработать…
^(.*)[0-9]