【问题标题】:How to identify IATA or ICAO codes from string如何从字符串中识别 IATA 或 ICAO 代码
【发布时间】:2019-02-18 08:34:24
【问题描述】:

我正在开发与航班相关的 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# 中借助正则表达式匹配来做到这一点?目前这是我的代码,缺少最后两种情况:

// 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;

提前谢谢你。

【问题讨论】:

    标签: c# regex replace split


    【解决方案1】:

    你可以使用

    @"^([A-Za-z]{3}|[A-Za-z][0-9]|[0-9][A-Za-z])([0-9]+)$"
    

    regex demo

    详情

    • ^ - 字符串开头
    • ([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 位以上
    • $ - 字符串结束。

    【讨论】:

    • 那是完美的。我忘了提到还有 2 个字母代码,但是用这个表达式很容易修复。非常感谢
    • ^([A-Za-z]{2}|[A-Za-z]{3}|[A-Za-z][0-9]|[0-9][A-Za-z])([0-9]+)$ 这应该是正确的正则表达式......不过谢谢
    • 我刚刚意识到有一个维珍航班VIR137Y :( 所以这应该可以工作^([A-Za-z]{2}|[A-Za-z]{3}|[A-Za-z][0-9]|[0-9][A-Za-z])([0-9]+[A-Za-z]?)$
    【解决方案2】:

    不使用正则表达式,您可以使用一个简单的例程来识别您的三种情况:

    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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2015-12-16
      • 2010-09-27
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多