【问题标题】:Regex for splitting apparel sizes用于拆分服装尺寸的正则表达式
【发布时间】:2020-02-02 17:03:25
【问题描述】:

我有以下输入(仅作为示例,真实输入包含更多疯狂的数据)

$values = [
    '32/34, 36/38, 40/42, 44/46',
    '40/42/44/46/48',
    '58/60',
    '39-42',
    '40-50-60',
    '24-25,26,28,30',
    '36 40,5 44',
];

并希望通过/, 等分隔符将其拆分,但保留成对的值。仅当分隔符未多次出现时才应这样做,因此结果应如下所示:

'32/34, 36/38, 40/42, 44/46'
    => [ '32/34', '36/38', '40/42', '44/46' ]
'40/42/44/46/48'
    => [ '40', '42', '44', '46', '48' ]
'58/60'
    => [ '58/60' ]
'39-42'
    => [ '39-42' ]
'40-50-60'
    => [ '40', '50', '60' ]
'24-25,26,28,30'
    => [ '24-25', '26', '28', '30' ]
'36 40,5 44'
    => [ '36', '40,5', '44' ]

到目前为止我所拥有的是

$separator = '^|$|[\s,\/-]';
$decimals = '\d+(?:[,.][05])?';
foreach ($values as $value) {
    preg_match_all('/' .
        '(?<=' . $separator . ')' .
        '(?:' .
            '(?P<var1>(' . $decimals . ')[\/-](?-1)|(?-1))' .
        ')(?=' . $separator . ')' .
    '/ui', $value, $matches);
    print_r($matches);
}

但这对于返回的40/42/44/46/48 失败

[var1] => Array
    (
        [0] => 40/42
        [1] => 44/46
        [2] => 48
    )

但是每个数字都应该单独返回。修改正则表达式为'(?P&lt;var1&gt;(' . $decimals . ')([\/-])(?-2)|(?-2))(?!\3)'更好,但仍然返回错误结果

[var1] => Array
    (
        [0] => 40
        [1] => 42
        [2] => 44
        [3] => 46/48
    )

正确的正则表达式应该是什么样子的?

【问题讨论】:

  • 也许只是先将其解析为 CSV,然后在 -/ 上进行 preg_split。
  • @user3783243 由于输入数据的混合,我的正则表达式变得非常复杂,CSV 不是一个选项
  • 好吧,我使用了这个looooooong 逻辑,但它可能会因为你的疯狂数据而失败。
  • @Rahul 你有没有看到第二个值中的40/42 被错误地捕获在一个组中?
  • 是的。这不是一个确切的解决方案。只是正则表达式的一个想法。我确信使用编程有更有效的方法。

标签: php regex preg-match preg-match-all


【解决方案1】:

正如上面的 cmets 所述,我知道由于用户输入,100% 匹配是不可能的。但我找到了一个适合我大多数用例的正则表达式:

(?<=^|$|[\s,\/-])(?:(?P<var1>(?<![\/-])(?!(?:(\d+(?:[,.][05])?)[\/-]){2}(?-1))(\d+(?:[,.][05])?)[\/-](?-1)|(?-1)))(?=^|$|[\s,\/-])

https://regex101.com/r/q3YSa7/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2020-02-07
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多