RegEx 以匹配按特定规则排除数字的文本字符串



我有一些字符串:

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
  1. 如果数字没有与字母[A-Z]在一起,那么图案应该在它们之前抓取。
  2. 如果在字母[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

最新更新