首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按照特定规则分开字符和数字

按照特定规则分开字符和数字
EN

Stack Overflow用户
提问于 2016-10-06 12:08:20
回答 2查看 133关注 0票数 1

我在试着区分航班号。

代码语言:javascript
复制
Example: 
flightno = "FR556"
split_data = flightno.upcase.match(/([A-Za-z]+)(\d+)/)
first  = split_data[1] # FR
second = split_data[1] # 556

然后,我继续查询数据库,在本例中基于FR找到一家航空公司,并应用一些逻辑,结果是Ryanair。

我的问题是航班号可能是:

代码语言:javascript
复制
flightno = "U21920"
split_data = flightno.upcase.match(/([A-Za-z]+)(\d+)/)
first  = split_data[1] # U
second = split_data[1] # 21920

我首先想要的是U2,而不仅仅是U,这是用来搜索航空公司的数据库的,在本例中是U2。

为了清晰起见,我在问问题时犯了一些术语上的错误。由于预订参考编号的复杂性,输入是从乘客提供的任何内容中提取的。例如,对于easyJet航班,乘客可能只输入EZY1920或U21920,因此乘客真的很无知。

"EZY“=民航组织"U2”=空运协会

我接受用户的输入,试图将民航组织或空运协会从"1920“航班号中分离出来,但如果不搜索数据库或将输入分开,我认为从用户体验的角度来看,这是无法确定的。

使用regex将字符和数字分开使用,直到用户输入IATA作为其航班号的一部分(乘客不会知道区别),正如您在上面的示例中所看到的,这会混淆regex。**

问题是我想不出其他的航班号码模式。他们总是至少有两个字符组成的字母或一个字母和数字的混合物,可以是3个字符的长度。数字部分可以短到1,也可以长到4--总是数字。

*编辑**正如评论中提到的,没有固定的大小,但是有一件事总是正确的(至少到目前为止)是,第一个字符总是一个字母,不管它是民航组织还是空运协会。在考虑到目前为止每个机构的输入后,我想知道是否搜索数据库并返回与用户(U2)、(FR)、(EZ)提供的前两封信相匹配的国际航空运输协会或国际民航组织的航空公司可能是一条路,然而,如果国际民航组织或空运协会发布与另一家航空公司匹配的航空公司,例如"EZY“和"EZT”,这将是一个明显的问题。这不是未来的证据,我正在寻找更好的红宝石或regex解决方案。**

谢谢你的意见。

编辑

我在下面回答了我自己的问题。虽然其他答案为处理某些条件提供了解决方案,但如果航班号以一个数字开头,它们就会掉下来,所以我想出了一个粗制滥造的方法,但到目前为止,稳定的方法是分析字符串的数字,然后从数字中计算出它是民航组织还是空运协会。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-08 13:47:02

我有一个相当蹩脚的解决方案,似乎在所有的方案,我可以扔到目前为止。我想把它提供给其他可能觉得有用的人?

飞行代码/数字的一般经验法则似乎是:

IATA:由任意组合字母和数字组成的两个字符

民航组织:三个字符仅由字母组成(迄今)

考虑到这一点,我们应该能够根据前三个字符的情况,计算出是否需要空运协会或国际民航组织搜索数据库。

,我们先取航班号,然后转换成大写的

代码语言:javascript
复制
string  = "U21920".upcase

接下来,我们将分析前三个字符以检查任何数字。

代码语言:javascript
复制
first_three = string[0,3] # => U21

first_three?中有数字吗?

代码语言:javascript
复制
if first_three =~ /\d/ # => true
iata = first_three[0,2] # => If true lets get rid of the last character
# Now we go to the database searching IATA (U2)

search = Airline.where('iata LIKE ?', "#{iata}%") # => Starts with search, just in case

否则,如果在字符串中找不到数字,则为

代码语言:javascript
复制
else
 icao = string.match(/([A-Za-z]+)(\d+)/)
 search = Airline.where('icao LIKE ?', "#{icao[1]}%")

这似乎适用于我今天从几个主要的机场现场离港/到达板上测试的随机航班号码。这是一个有趣的问题,因为一些航空公司会以国际民航组织或国际航空运输协会的代码作为航班号码的一部分,这意味着乘客不会知道任何不同的信息,更不用说,一些机场以自己的格式提供航班信息,因此国际民航组织和国际航空运输协会的建设不会有任何改变,因此上述内容应该可以运作。

下面是一个可以运行的示例脚本

test.rb

代码语言:javascript
复制
puts "What is your flight number?"
string  = gets.upcase
first_three = string[0,3]
puts "Taking first three from #{string} is #{first_three}"

if first_three =~ /\d/         # Calling String's =~ method.
 puts "The String #{first_three} DOES have a number in it."
 iata = first_three[0,2]
 search = Airline.where('iata LIKE ?', "#{iata}%")
 puts "Searching Airlines starting with IATA #{iata} = #{search.count}"
 puts "Found #{search.first.name} from IATA #{iata}"
else
 puts "The String #{first_three} does not have a number in it."
 icao = string.match(/([A-Za-z]+)(\d+)/)
 search = Airline.where('icao LIKE ?', "#{icao[1]}%")
 puts "Searching Airlines starting with ICAO #{icao[1]} = #{search.count}"
 puts "Found #{search.first.name} from IATA #{icao[1]}"
end

航空公司

代码语言:javascript
复制
Airline(id: integer, name: string, iata: string, icao: string, created_at: datetime, updated_at: datetime )

将其放入lib文件夹并运行

rails运行程序库/test.rb

显然,您可以删除所有puts语句以直接获得结果。在运行脚本时,我使用rails runner来包含对我的航空公司模型的访问。

票数 0
EN

Stack Overflow用户

发布于 2016-10-06 12:18:25

我认为的一个解决方案是,将给定的航班号与国际民航组织/空运协会代码的完整列表相匹配:https://raw.githubusercontent.com/datasets/airport-codes/master/data/airport-codes.csv

花点时间在谷歌上可能会给你一个更合适的列表。

然后使用您的航班号的前三个字符(如果这是最大的)来查找国际民航组织代码中的匹配。如果你找到一个,你就会知道在哪里分离你的字符串。

这里是一个最小的丑陋的例子,应该会让你走上正轨。随时更新!

代码语言:javascript
复制
ICAOCODES = %w(FR DEU U21) # grab your data here

def retrieve_flight_information(flightnumber)
  ICAOCODES.each do |icao|
    co = flightnumber.match(icao).to_s
    if co.length > 0
      # airline
      puts co
      # flight number
      puts flightnumber.gsub(co,'')
    end
  end
end

retrieve_flight_information("FR556")
#=> FR
#=> 556
retrieve_flight_information("U21214123")
#=> U21
#=> 214123

最大的缺陷在于使用.gsub(),因为它可能会弄糟您的航班号,以防出现这样的情况:"FR21413FR2",但是您会在上面找到很多解决这个问题的方法。

正如评论中提到的那样,国际民航组织的代码清单并不是你想要的。但与此相关的是,您需要一个字符串列表,您可以安全地与之进行比较。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39895593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档