我如何根据整个字符串中的内容使第 1 组有所不同?

How can i make group 1 differ based on content in the whole string?

在我们的 Python 系统中,我试图隔离尺寸的第二部分以确保我可以单独保存值。

由于我以多种不同的方式获取数据,因此我必须考虑很多情况!同时,我们的系统要求正确识别组 1 中的所有内容,这增加了复杂性!

这是我目前得到的:

(?<=[\/\-])\s*([A-Za-z]+|\w+)+?(?!\d*\s*\)|\d*\)|\w*\))(?!\s*[\/\-]+)

示例

工作

这些是我的例子:

110/116
S/M
S / M
S/M(32-34)
110/116(10-12y)
110/116(S/M)

不工作

然而,我的正则表达式只能在上述示例中正常运行。

以下 7 个导致问题:

S/M / L /XL
S / M / L / XL
S/M / L/XL
S/M/L/XL
S/M/L/XL(30-32)
S/M / L/XL(30-32)
S/M / L / XL(30-32)

我怎样才能捕捉到这些案例 table:

Case Input Expected capture in group 1
1 S/M / L /XL "L /XL"
2 S / M / L / XL "L / XL"
3 S/M / L/XL "L/XL"
4 S/M/L/XL "L/XL"
5 S/M/L/XL(30-32) "L/XL"
6 S/M / L/XL(30-32) "L/XL"
7 S/M / L / XL(30-32) "L / XL"

问题

如何在中间捕获一个 "/",包括后面的整个部分(如 /XL)但没有任何后续括号(如不是 (30/32))。

示例 S/M / L / XL(30-32) 我只想捕获 L / XL

您可以使用

(?<=[/-])\s*([A-Z]+(?:\s*/\s*[A-Z]+)?|\d+)\b(?!\s*[/)-])

regex demo详情:

  • (?<=[/-]) - 紧接在 /-
  • 之前的位置
  • \s* - 零个或多个空格
  • ([A-Z]+(?:\s*/\s*[A-Z]+)?|\d+) - 第 1 组:一个或多个大写字母,然后是包含零个或多个空格的 / 字符的可选序列,然后是一个或多个大写字母,或者一个或更多数字
  • \b - 单词边界
  • (?!\s*[/)-]) - 在当前位置的右侧,不能有零个或多个空格,然后是 /)-