Regex lookahead only removing the last character

前端 未结 1 898
青春惊慌失措
青春惊慌失措 2021-01-21 17:29

Im creating a regex that searches for a text, but only if there isnt a dash after the match. Im using lookahead for this:

  • Regex: Text[\\s\\.][0-9]*(?!-)
相关标签:
1条回答
  • 2021-01-21 18:08

    The [0-9]* backtracks and lets the regex engine find a match even if there is a -.

    There are two ways: either use atomic groups or check for a digit in the lookahead:

    Text[\s.][0-9]*(?![-\d])
    

    Or

    Text(?>[\s.][0-9]*)(?!-)
    

    See the regex demo #1 and the regex demo #2.

    Details

    • Text[\s.][0-9]*(?![-\d]) matches Text, then a dot or a whitespace, then 0 or more digits, and then it checks of there is a - or digit immediately to the right, and if there is, it fails the match. Even when trying to backtrack and match fewer digits than it grabbed before, the \d in the lookahead will fail those attempts
    • Text(?>[\s.][0-9]*)(?!-) matches Text, then an atomic group starts where backtracking won't be let in after the group patterns find their matching text. (?!-) only checks for a - after the [0-9]* pattern tries to grab any digits.
    0 讨论(0)
提交回复
热议问题