Я разрабатываю API, связанный с полетом, и мне нужно разделить код перевозчика и номер рейса кода, который я получаю. Например:
UA775 -> UA and 775
этот случай тривиален. Но есть разные типы кодов IATA и ICAO, и я определил следующие шаблоны:
letter letter letter {digit}+
letter digit {digit}+
digit letter {digit}+
Итак, три буквы, затем связка цифр, буква и цифра, а затем связка цифр или цифра, затем буква, а затем связка цифр. В последних двух случаях это должно работать так:
X3567 -> X3 and 567
5U9997 -> 5U and 9997
Есть ли способ сделать это в C# с помощью сопоставления Regex? В настоящее время это мой код, в котором отсутствуют последние два случая:
// e.g:
carrierAndFlightNumber = "X3567";
Regex regex = new Regex(@"([a-zA-Z]+)(\d+)");
Match result = regex.Match(carrierAndFlightNumber);
string carrier = result.Groups[1].Value;
string flightNumber = result.Groups[2].Value;
Заранее спасибо.
Вы можете использовать
@"^([A-Za-z]{3}|[A-Za-z][0-9]|[0-9][A-Za-z])([0-9]+)$"
См. демонстрация регулярного выражения
Подробности
^
- начало строки([A-Za-z]{3}|[A-Za-z][0-9]|[0-9][A-Za-z])
- Группа 1:
[A-Za-z]{3}
- 3 буквы|
- или[A-Za-z][0-9]
- буква и цифра|
- или[0-9][A-Za-z]
- цифра и буква([0-9]+)
- Группа 2: 1+ цифр$
- конец строки.Без использования регулярного выражения вы можете использовать простую процедуру, которая идентифицирует ваши три случая:
using System;
using System.Linq;
namespace IdentifyIATA
{
public static class Iata
{
public static Tuple<string,string> CodeIdentifier(string code)
{
var first = code.Substring(0, 3);
if (first.All(char.IsLetter)){
return new Tuple<string, string>(first, code.Substring(3));
}
return new Tuple<string, string>(code.Substring(0, 2), code.Substring(3));
}
}
}
Первый элемент кортежа возвращает первую часть вашего кода, а второй - вторую: я использовал эту небольшую программу для проверки:
using System;
namespace IdentifyIATA
{
class Program
{
static void Main(string[] args)
{
var result = Iata.CodeIdentifier(args[0]);
Console.WriteLine($"Code: {result.Item1}, {result.Item2} ");
Console.ReadLine();
}
}
}
Это идеально. Я забыл упомянуть, что есть также двухбуквенные коды, но с этим выражением это легко исправить. Большое спасибо