首页 > 解决方案 > 隔离以各种方式编写的大小,同时将其保持在第 1 组中

问题描述

当我有多种尺寸时,Wiktor 帮助我隔离值:

(?i)([a-z\d]+(?:[/-][a-z\d]+)?)[/-]([a-z\d]+(?:[/-][a-z\d]+)?)

但是我无法研究它如何处理单一尺寸

测试用例:

S1 - XXS/XS-S/M
S1 - 40-42-36-38
XXS/XS
40-42
40

通过上述示例,我可以匹配所有相关尺寸,但不能匹配最后一个“40”

如果它是一个单一的值,我怎么能考虑抓住这个值。但是,目前看来这不可行。

所以我一直想知道是否有可能抓住高亮的,这样我总是能得到第 1 组中第一个尺寸的结果

S1 - XXS/XS -S/M

S1 - 40-42 -36-38

XXS /XS

40 -42

40

所需值以粗体突出显示。

几乎我只需要确保最后我有两个结果可以展示每种尺寸 - 无论前面是什么都无所谓!

真的希望有人能在正确的道路上帮助我 - 尺寸总是用 - 或 / 或“ - ”和“ / ”分隔

标签: regex

解决方案


如果您的字符串应该从字符串的开头匹配,一个选项可能是使用锚来断言字符串的开头。

(?i)^(?:[a-z]+\d*(?:\s*-\s*[a-z\d]+[/-][a-z\d]+)?|\d+)\b
  • (?i)不区分大小写匹配的内联修饰符
  • ^字符串的开始
  • (?:非捕获组
    • [a-z]+\d*匹配 1+ 个字符 az 和可选数字
    • (?:非捕获组
      • \s*-\s*-可选空白字符之间的匹配
      • [a-z\d]+[/-][a-z\d]+匹配字符 az 或数字中的一个-或之间/
    • )?关闭组并使其可选
    • |或者
    • \d+匹配 1+ 个数字
  • )\b关闭非捕获组和单词边界以防止部分匹配

正则表达式演示

如果支持环视,另一个想法是在左侧使用单词边界并隔离您要匹配的特定部分

(?i)\b(?:[a-z]\d\s*[-/]\s*(?:[a-z\d]+[/-][a-z\d]+)|(?<!-)(?:[a-z]+(?=/)|\d+))\b

正则表达式演示

或者使用捕获组捕获您想要的内容,并匹配可选的非空白字符以防止给定示例的部分匹配。

(?i)\b([a-z\d]+(?:\s*-\s*[a-z\d]+[/-][a-z\d]+)?)\S*

正则表达式演示


推荐阅读