我有一些字符串:
ALFA ROMEO 4C
BMW X7 BLACK
BMW X7 BLACK COLOUR
BMW X7
BMW
BMW X 7
BMW 7 SERIES
BMW 7SERIES
BMW 7S
BMW (X7)
我想得到:
ALFA ROMEO 4C
BMW X7 BLACK
BMW X7 BLACK COLOUR
BMW X7
BMW
BMW X
BMW
BMW 7SERIES
BMW 7S
BMW
- 如果数字没有与字母
[A-Z]
在一起,那么图案应该在它们之前抓取。 - 如果在字母
[A-Z]
和空格之后没有字母[^A-Z]
,则图案应该在它们之前抓取。
如果支持正面展望,则可以使用开始匹配[A-Z]
,并在不包含数字时重复匹配右侧 0+ 次[A-Z0-9]+
。
^[A-Z]+(?: (?![0-9]+b)[A-Z0-9]+)*
解释
^
字符串开头[A-Z]+
匹配 1+ 次字符 A-Z(?:
非捕获组(?![0-9]+b)`
匹配空间,断言直接在右侧的内容不仅仅是数字[A-Z0-9]+
匹配 1+ 次字符 A-Z 或数字
)*
正则表达式演示
没有列出任何语言,但例如使用 Javascript:
const pattern = /^[A-Z]+(?: (?![0-9]+b)[A-Z0-9]+)*/;
[
"ALFA ROMEO 4C",
"BMW X7 BLACK",
"BMW X7 BLACK COLOUR",
"BMW X7",
"BMW",
"BMW X 7",
"BMW 7 SERIES",
"BMW 7SERIES",
"BMW 7S",
"BMW (X7)"
].forEach(str => console.log(str.match(pattern)[0]));
有点复杂,但这可能有效:
^[A-Z ]+?(d[A-Z]|[A-Z]d).*|^[A-Z ]+
您的比赛将处于$0
ALFA ROMEO 4C
BMW X7 BLACK
BMW X7 BLACK COLOUR
BMW X7
BMW
BMW X
BMW
BMW 7SERIES
BMW 7S
BMW
https://regex101.com/r/YZ9uuw/1