regular expressions: match x times OR y times

后端 未结 4 1444
面向向阳花
面向向阳花 2020-12-01 17:46

Lets say I need to match a pattern if it appears 3 or 6 times in a row. The closest I can get is something like \\d{3,6} but that doesn\'t quite do what I need.

\'12

相关标签:
4条回答
  • 2020-12-01 18:23

    First one matches 3, 6 but also 9, 12, 15, .... Second looks right. Here's one more twist:

    \d{3}\d{3}?
    
    0 讨论(0)
  • 2020-12-01 18:30

    For this case we can get away with this crafty method:

    Clean Implementation

    /(\d{3}){1,2}/
    /(?:\d{3}){1,2}/
    

    How?!

    This works because we're looking for multiples of three that are consecutive in this case.

    Note: There's no reason to capture the group for this case so I add the ?: non capture group flag to the capture group.

    This is similar to paxdiablo implementation, but slightly cleaner.

    Matching Hex

    I was doing something similar for matching on basic hex colors since they could be 3 or 6 in length. This allowed me to keep my hex color checker's matching DRY'd up ie:

    /^0x(?:[\da-f]{3}){1,2}$/i
    
    0 讨论(0)
  • 2020-12-01 18:39

    How about:

    (\d\d\d){1,2}
    

    although you'll also need guards at either end which depend on your RE engine, something like:

    [^\d](\d\d\d){1,2}[^\d]
    

    or:

    ^(\d\d\d){1,2}$
    
    0 讨论(0)
  • 2020-12-01 18:45
    ^(\d{3}|\d{6})$
    

    You have to have some sort of terminator otherwise \d{3} will match 1234. That's why I put ^ and $ above. One alternative is to use lookarounds:

    (?<!\d)(\d{3}|\d{6})(?!\d)
    

    to make sure it's not preceded by or followed by a digit (in this case). More in Lookahead and Lookbehind Zero-Width Assertions.

    0 讨论(0)
提交回复
热议问题