首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex将匹配字母和数字的组合,而不是以"km“结尾。

Regex将匹配字母和数字的组合,而不是以"km“结尾。
EN

Stack Overflow用户
提问于 2018-11-20 02:05:08
回答 3查看 12.6K关注 0票数 0

我是新来的,所以我会尽力的。

我有一行文字包含不同的汽车信息。

651公里,轿车,手动,18131 A,FWD,使用,5.5L/100公里,丰田,凯美瑞,东南,{AC,加热座椅,加热镜,无键进入},2010年

我试图写一个正则表达式,它将匹配字母和数字的组合,而不是以"km“结尾。这是汽车的序列号,可以不同的汽车制造商之间。例如:

18FO724A、18131A、19BF723A

这是来自不同车型的不同序列号。

我试过这个:

代码语言:javascript
运行
复制
/((?:[a-zA-Z]+[0-9]+[^km]$|[0-9]+[a-zA-Z])[a-zA-Z0-9])/

但它一直在返回公里#

65101公里

而我需要的答案是

第18131 A号

任何帮助都行。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-20 02:41:08

从您提供的示例中可以看出,您的序列号总是以数字开头,以字母结尾--如果这不是真的,请参考我的意见并阅读如何更好地帮助您。

这一模式应能发挥作用:

代码语言:javascript
运行
复制
/(\d+[a-z0-9]+[a-z](?<!km\b))(?:,|$)/i

这需要以下条件:

  • \d+从至少一个或多个+数字\d开始
  • [a-z0-9]+后面跟着任何字母数字字符[a-z0-9],一次或多次+
  • (?<!km\b))(?:,|$)负查找,它断言字符串以逗号,或字符串$的结尾结尾,但如果它在字母km (?<!km\b)后面出现,则不会。

这使用单个捕获组(...),因此不包括整个匹配所附带的逗号,

regex101上看

票数 4
EN

Stack Overflow用户

发布于 2018-11-20 02:31:02

我的理解是,给定一个字符串,您希望提取具有以下属性的所有子字符串:

  • 子字符串前面有逗号,或以字符串开头,后面跟着逗号或结束字符串;
  • 子字符串只包含数字和大写字母;
  • 子字符串包含至少一个数字;
  • 该子字串至少包含一个大写字母;及
  • 子字符串不能以字符串"km"结尾。

测试字符串如下。

代码语言:javascript
运行
复制
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提取所需的子字符串。

代码语言:javascript
运行
复制
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"]

或者,您可以通过四个简单的步骤来完成这一任务。

代码语言:javascript
运行
复制
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}代替了它。

代码语言:javascript
运行
复制
 r = /(?<=\A|,)[\p{Lu}\d]*(?:\d\p{Lu}|\p{Lu}\d)[\p{Lu}\d]*(?<!km)(?=,|\z)/
票数 0
EN

Stack Overflow用户

发布于 2018-11-20 07:28:53

首先,我将用逗号将该行分成几个项目,然后将正则表达式应用于每个项:

代码语言:javascript
运行
复制
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(开头为负前瞻)。

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

https://stackoverflow.com/questions/53385201

复制
相关文章

相似问题

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