Variable length look-behind

后端 未结 5 1145
猫巷女王i
猫巷女王i 2020-12-16 13:38

Is there any elegant solution to build a variable length look-behind regex such as this one ?

/(?<=eat_(apple|pear|orange)_)today|yesterday/g;

相关标签:
5条回答
  • 2020-12-16 13:58

    Blog post found today, linked to me at #regex @ irc.freenode.org:

    http://www.drregex.com/2019/02/variable-length-lookbehinds-actually.html

    This article explains how to do a variable width look-behind in PCRE.

    The solution would then be:

    /(?=(?=(?'a'[\s\S]*))(?'b'eat_(?:apple|pear|orange)_(?=\k'a'\z)|(?<=(?=x^|(?&b))[\s\S])))today|yesterday/g

    https://regex101.com/r/9DNpFj/1

    0 讨论(0)
  • 2020-12-16 14:00

    You can use look-ahead instead of look-behind:

    /(?:eat_(apple|pear|orange)_)(?=today|yesterday)/g
    

    and in general, there is an alternative way to describe things that naively seem to require look-behind.

    0 讨论(0)
  • 2020-12-16 14:03

    Use \K as a special case.

    It's a variable length positive lookbehind assertion:

    /eat_(?:apple|pear|orange)_\Ktoday|yesterday/g
    

    Alternatively, you can list out your lookbehind assertions separately:

    /(?:(?<=eat_apple_)|(?<=eat_pear_)|(?<=eat_orange_))today|yesterday/g
    

    However, I would propose that it's going to be a rare problem that could potentially use that feature, but couldn't be rethought to use a combination of other more common regex features.

    In other words, if you get stuck on a specific problem, feel free to share it here, and I'm sure someone can come up with a different (perhaps better) approach.

    0 讨论(0)
  • 2020-12-16 14:03

    Alternative solution - reverse the string and use lookahead instead. It may look ugly having to write the pattern words in reverse but it's an option when everything else fails.

    0 讨论(0)
  • 2020-12-16 14:04

    How about:

    (?:(?<=eat_apple_)|(?<=eat_pear_)|(?<=eat_orange_))(today|yesterday)
    

    A little bit uggly, but it works.

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