首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹药口径的正则表达式设计

弹药口径的正则表达式设计
EN

Stack Overflow用户
提问于 2018-08-03 02:44:56
回答 2查看 112关注 0票数 0

我需要你的帮助,解决一个问题,我正在排序大量的库存物品从一个API到一个在线商店。

我遇到的问题是,许多物品都是弹药,它们被归类为弹药,但我需要将它们按特定口径分类。

我用来导入和分类它们的工具支持正则表达式,所以我想看看是否可以这样解决这个问题。虽然我只知道使用正则表达式的基本知识,但我目前还不知道如何做这样的事情。我在想,我可以从标题中提取出口径,因为它们经常包含在其中。

该表达式可能需要排序的几个标题示例:

  • 联邦Cartridge经典火箭炮16 2 3/4“1
  • 温彻斯特美国Ammo 5.56MM (223) 55 223。FMJ/20
  • 联邦Cartridge 7.62x51mm 149gr FMJ /500

如果能从你们那里得到任何帮助或指导,我将不胜感激。如果我能通过Regex来解决这个问题,我会节省很多时间。

代码语言:javascript
复制
Edits / Expectation from the title: 

Federal Cartridge 7mm RemMag 150gr SierBTSP VtSh/20 -> 7mm, 
Winchester Ammo SupX 38 SPL Smokeless Powder , -> 38 SPL
Federal Cartridge 300 Sav 180gr SP Power-Shock /20, -> 300 Sav 
Winchester Ammo USA 5.56MM (223) 55Gr. FMJ/20, -> 5.56MM
Winchester Ammo SupX 45 Colt 255Gr. Lead RN/20, -> 45 Colt
Winchester Ammo SupX 12ga 2.75″ 7.5-Shot HeavyGam, -> 12ga
Winchester Ammo SupX 22LR #12-Shot Rimfire /50, -> 22LR
Winchester Ammo SupX 7.62X39 123gr SP/20 -> 7.62x39

我希望这比较容易理解。很抱歉有这么晚的跟进。工作一直在蚕食我的时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-20 20:38:20

可以这样编写regex模式(有几种正确的方法可以这样做):

演示:https://regex101.com/r/uVq3W1/3/

代码语言:javascript
复制
~(?:\d+(?:\.\d+)?(?|mm|x\d+)|\d+(?|ga|lr| Sav| Colt| SPL))\b~i

或者像这样在逻辑上拆分以帮助您查看分组:

代码语言:javascript
复制
~
(?:
  \d+(?:\.\d+)?(?|mm|x\d+)
  |
  \d+(?|ga|lr| Sav| Colt| SPL)
)
\b
~i

\b元字符是一个单词边界,它确保以所需字符串开头的较大单词不匹配。(您不想与1 splash相匹配)

i模式修饰符(在末尾)强制regex引擎不敏感地匹配案例。

(?: ... )是一个非捕获组,(?| ...)是一个分支重置组.https://regular-expressions.mobi/branchreset.html?wlr=1有效地,这些是用来维护模式逻辑。

+是一个量词,意思是前面表达式的“一个或多个”。

?是一个量词,意思是前面表达式的“0或1”。

票数 1
EN

Stack Overflow用户

发布于 2018-08-03 03:32:04

试试看。这将执行一个类似的比较搜索您的标题与每编译的一系列口径。输出将是一个数组,其中每个键都是找到的口径。

为了使这个工作,您将必须创建一个数组的口径,您希望找到。您可能甚至可以找到一个相当全面的列表,您可以很容易地转换成一个数组。

不管怎样,给你。

代码语言:javascript
复制
$titles = array(

  'Remington 7.62x51mm 149gr FMJ',
  'Horandy .45cal HP',
  'Federal Cartridge Classic Buckshot 16ga 2 3/4" 1',
  'Winchester Ammo USA 5.56MM (223) 55Gr. FMJ/20',
  'Federal Cartridge 7.62x51mm 149gr FMJ /500'

);

$calibers = array(

'7.62x51',
'.22',
'.45',
'9mm'

);

foreach($calibers as $caliber){

  $results[$caliber] = array_filter($titles, function ($item) use ($caliber) {
      if (stripos($item, $caliber) !== false) {
          return TRUE;
      }
      return FALSE;
  });

}

print_r($results);

这将产生以下结果:

代码语言:javascript
复制
Array
(
    [7.62x51] => Array
        (
            [0] => Remington 7.62x51mm 149gr FMJ
            [4] => Federal Cartridge 7.62x51mm 149gr FMJ /500
        )

    [.22] => Array
        (
        )

    [.45] => Array
        (
            [1] => Horandy .45cal HP
        )

    [9mm] => Array
        (
        )

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

https://stackoverflow.com/questions/51664616

复制
相关文章

相似问题

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