【问题标题】:Matching model name preceeded by brand in a string匹配字符串中前面有品牌的型号名称
【发布时间】:2020-12-21 02:32:27
【问题描述】:

TL\DR

考虑以下正则表达式:

(?<=^|\s|,)((?<=Continental|Conti)(?:\s|,)?Ts8|other)

我正在尝试使用上面的正则表达式来匹配下面字符串中的Ts8

Conti Ts8 some other string

有人可以向我解释一下,为什么这个正则表达式匹配我输入的 other 字符串,而不是 Ts8 部分?

当我解释那个正则表达式时,我告诉我的脚本,从我的字符串中匹配这两件事:

  • 字符串other前面有空格或逗号,或者
  • 字符串 Ts8,前面有空格或逗号,前面有字符串 ContiContinental 之一,然后前面有空格或逗号

我想要的是一个正则表达式,它将匹配所有这些输入:

  • 继续 Ts8
  • 欧陆 Ts8
  • 我的其他字符串
  • ContiTs8
  • ContinentalTs8

但不会匹配

  • 超级大陆 Ts8
  • 超级大陆Ts8

长版

我正在尝试根据包含一堆模型的模型数组从字符串中匹配模型名称。我也知道这些型号的品牌。有些型号名称很短(字符很少),有些型号只包含数字。我想减少在这种情况下匹配误报的可能性,仅在它们与模型的品牌之前进行匹配。

我们以名为 MyBrand 的品牌为例。我知道这个品牌有两个型号,型号为12和型号为LatestSuperBestModel。由于 LatestSuperBestModel 似乎是一个相当独特的名称,我很容易通过字符串中的模型名称简单地匹配它。但是由于 12 只是一堆数字,如果我只匹配的话,我可能会得到大量的误报匹配。但是为了仍然能够匹配该型号,我想将品牌名称添加到匹配项中,因为与品牌名称一起,MyBrand 12 我更有可能确实匹配型号名称来自字符串,而不是任意数字。

【问题讨论】:

  • 您与other 有一个交替,所以它匹配也就不足为奇了。只有一个断言(?<=^|\s|,) 并且它被实现了。
  • 为什么我之前的改动也不匹配?我的意思是,对于问题中的示例,我确实匹配了 other 字符串,但 Ts8 部分不匹配。如果我删除更改,Ts8 部分仍然不匹配,这意味着我根本没有匹配到字符串。

标签: regex


【解决方案1】:

您可以将此正则表达式用于您的案例:

(?<=^|[\h,])(?:Conti(?:nental)?[\h,]?\KTs8|other)\b

RegEx Demo

正则表达式演示:

  • (?&lt;=^|[\h,]):
  • (?::启动非捕获组
    • Conti(?:nental)?:
    • [\h,]?可选匹配空格或逗号
    • \K:重置所有匹配信息
    • Ts8:匹配TsB
    • |:或者
    • other:匹配other
  • ): 结束非捕获组
  • \b:字边界

【讨论】:

  • 我不知道\K。这改变了游戏规则,谢谢!
猜你喜欢
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多