我是新来的,所以我会尽力的。
我有一行文字包含不同的汽车信息。
651公里,轿车,手动,18131 A,FWD,使用,5.5L/100公里,丰田,凯美瑞,东南,{AC,加热座椅,加热镜,无键进入},2010年
我试图写一个正则表达式,它将匹配字母和数字的组合,而不是以"km“结尾。这是汽车的序列号,可以不同的汽车制造商之间。例如:
18FO724A、18131A、19BF723A
这是来自不同车型的不同序列号。
我试过这个:
/((?:[a-zA-Z]+[0-9]+[^km]$|[0-9]+[a-zA-Z])[a-zA-Z0-9])/
但它一直在返回公里#
65101公里
而我需要的答案是
第18131 A号
任何帮助都行。谢谢
发布于 2018-11-20 02:41:08
发布于 2018-11-20 02:31:02
我的理解是,给定一个字符串,您希望提取具有以下属性的所有子字符串:
"km"
结尾。测试字符串如下。
str = "65101km,Sedan,Manual,18131A,FWD,Used,5.5L/100km,Toyota,camry,SE," +
"{AC, Heated Seats, Heated Mirrors, Keyless Entry},2010,208A1,28km1"
注意,我已经在",208A1,28km1"
中附加了问题中给出的字符串。
可以使用具有以下正则表达式的方法String#scan提取所需的子字符串。
r = /
(?<=\A|,) # match the beginning of the string or a comma in a positive lookbehind
[\p{Upper}\d] # match a digit or uppercase letter in character class
* # perform above match zero or more times
(?: # begin a non-capture group
\d # match a digit
\p{Upper} # match an uppercase letter
| # or
\p{Upper} # match an uppercase letter
\d # match one or more digits
) # end non-capture group
[\p{Upper}\d] # match a digit or uppercase letter in character class
* # perform above match zero or more times
(?<!km) # do not match 'km' (negative lookbehing)
(?=,|\z) # match a comma or end of the string (positive lookahead)
/x # free-spacing regex definition mode
str.scan(r)
#=> ["18131A", "208A1"]
或者,您可以通过四个简单的步骤来完成这一任务。
str.split(',').select do |s| s.match?(/\A\p{Alnum}+\z/) &&
s.match?(/\p{Alpha}/) &&
s.match?(/\p{Digit}/) &&
!s.end_with?("km")
end
#=> ["18131A", "208A1"]
\p{}
结构的文档可以通过在雷吉普中搜索相同的内容来找到。它们类似于POSIX括号类,这些类被记录在同一个文件中。
正则表达式通常按以下方式写入(即,不使用空闲间隔模式)。我还用\p{Upper}
的缩写\p{Lu}
代替了它。
r = /(?<=\A|,)[\p{Lu}\d]*(?:\d\p{Lu}|\p{Lu}\d)[\p{Lu}\d]*(?<!km)(?=,|\z)/
发布于 2018-11-20 07:28:53
首先,我将用逗号将该行分成几个项目,然后将正则表达式应用于每个项:
input = "65101km,Sedan,Manual,18131A,FWD,Used,5.5L/100km,Toyota," \
"camry,SE,{AC, Heated Seats, Heated Mirrors, Keyless Entry},2010"
input.split(',').grep(/^(?!.*km)\d+\p{l}+$/)
#⇒ ["18131A"]
上面的内容返回一个数组,因此您可能希望以某种方式处理它(例如,使用first
)。
正则表达式本身匹配所有项,遵循与km
不匹配的模式km
(开头为负前瞻)。
https://stackoverflow.com/questions/53385201
复制相似问题