正则表达式:将数字拆分为可选的第一组,最多三组,最后一组最多三组

时间:2016-12-05 17:41:00

标签: regex nginx split

我有两个1-6位数字,用斜线分隔。我想要将这些分成最多3位数的组,从右边开始。

例如:

0/1 ->           [,0,,1]
1234/3 ->        [1,234,,3]
12345/1234 ->    [12,345,1,234]
123456/789123 -> [123,456,789,123]

我需要使用正则表达式来执行此操作,因为我想对NGINX中的某个位置执行此操作。可以使用应用程序逻辑执行此操作,但这不是由性能引起的问题。

解决部分问题的类似问题在这里使用否定前瞻:Regular expression to match last number in a string

正则表达式可以实现这种分裂?

更新 这个正则表达式接近我想要的(https://regex101.com/r/bQtNdK/3): (?<prefix1>\d{0,3}?)(?<threes1>\d{0,3})\/(?<prefix2>\d{0,3}?)(?=\d)(?<threes2>\d{0,3}) 如果斜杠后面的第二个数字长度超过3位,则匹配失败。

UPDATE2: 现在这个正则表达式适用于大多数组合(https://regex101.com/r/bQtNdK/5): (?<prefix1>\d{0,3}?)(?<threes1>\d{1,3})\/(?<prefix2>\d{0,3})(?<threes2>\d{3}) 如果我对prefix2 / threes2 prefix1 / threes1使用相同的正则表达式(即make prefix2也懒惰,我不明白为什么这会开始失败)。任何想法如何解决这个问题?如此接近......

2 个答案:

答案 0 :(得分:0)

我不知道如果没有正则表达式引擎能够记住匹配任意次数的匹配组的所有中间匹配(.NET can do this,而不是确定别人的意思)。 PCRE显然只会remember the 'last' match for each group,否则您可以使用this之类的内容:(?<prefix1>\d{0,2})(?:(?<threes1>\d{3})*)\/(?<prefix2>\d{0,2})(?<threes2>\d{3})*\s

答案 1 :(得分:0)

现在这个正则表达式似乎是正确的(regex101): (?<prefix1>\d{0,3}?)(?<suffix1>\d{1,3})\/(?<prefix2>\d{0,3}?)(?<suffix2>\d{1,3})\/