javascript - 正则表达式匹配摩托车名称并分别提取所有字母和数字

标签 javascript regex

(\w{1,4})(?:\s{0,1})(\d{1,4})(?:\s{0,1})(\w{1,4})\s

抱歉,如果这真的是丑陋的正则表达式,但我一点也不流利。

我需要一个正则表达式函数来从摩托车名称中提取所有可能的组合,例如:

我需要从本田 CBR500R 获得 CBR、500 和 R。我不确定我的正则表达式是否可以给我 CBR500 和 500R,因为那真的很不错!

某些类型的自行车名称:

Honda CBR500R
CBR 500 R
CBR 500R
CBR500 R
GS1000 S
XYZT 1000P
500ztx
KLR250 Honda
FZR 600 Suzuki
SV650
Text here XXXX 9999 XXXX 9999 XXXXX more text here

有没有办法改进我的正则表达式?让它变得更简单、更智能?

最佳答案

你可以使用

([A-Z]{2,})?[\s-]*(\d+)([a-z]+)?[\s-]*([A-Z]*\b)

参见 regex demo

正则表达式匹配:

  • ([A-Z]{2,})? - 第 1 组:一个或零个 2 个或多个大写 ASCII 字母序列
  • [\s-]* - 零个或多个 - 或空白符号
  • (\d+) - 第 2 组:一个或多个数字
  • ([a-z]+)? - 第 3 组:一个或多个 ASCII 小写字母的一个或零个序列
  • [\s-]* - 零个或多个 - 或空白符号
  • ([A-Z]*\b) - 第 4 组:零个或多个 ASCII 大写字母后跟单词边界。

这是一个sample extraction code in Python :

import re
p = re.compile(r'([A-Z]{2,})?[\s-]*(\d+)([a-z]+)?[\s-]*([A-Z]*\b)')
test_str = "Honda CBR500R\nCBR 500 R\nCBR 500R\nCBR500 R\nGS1000 S\nXYZT 1000P\n500ztx\nKLR250 Honda\nFZR 600 Suzuki\nText here XXXX 9999 XXXX 9999 XXXXX more text here"
for s in p.findall(test_str):
    print("New Entry:")
    for r in s:
        if r:
            print(r)

输出:

New Entry:
CBR
500
R
New Entry:
CBR
500
R
New Entry:
CBR
500
R
New Entry:
CBR
500
R
New Entry:
GS
1000
S
New Entry:
XYZT
1000
P
New Entry:
500
ztx
New Entry:
KLR
250
New Entry:
FZR
600
New Entry:
XXXX
9999
XXXX
New Entry:
9999
XXXXX

关于javascript - 正则表达式匹配摩托车名称并分别提取所有字母和数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566119/

相关文章:

javascript - 阻止 Cassette 缩小 JavaScript 文件

regex - 正则表达式 - 匹配不包含指定字符串文字的子字符串

python - 正则表达式向后匹配任何内容,直到字符串第一次出现

javascript - 从适用于 IE 但不适用于 Chrome 或 Firefox 的 iframe 中获取值(value)

java - 限制300字的正则表达式

javascript - 在 Javascript 中按大写字母拆分

java - 正则表达式转义字符

javascript - RequireJS 和 QUnit 基础知识中的单元测试

javascript - 什么是最有效的事件声明方式?

javascript - 当我点击浏览器的“后退”按钮时,AngularJS的 `$location.path()`没有改变?