Daniel
Daniel

Reputation: 1469

Regex to find string not followed by separator and 1 or 2 digits

I need to make a regex (.net flavour) that matches only "sometext" in the following strings (the second line has a space at the end):

sometext
sometext 
sometext dsf 2131
sometext-1234

but won't match anything in the following:

sometext  12
sometext 3
sometext2
sometext-1

That is it should match "sometext" only if it is not followed by any number of optional separator characters (like space, "-", "/", ".") and 1 or 2 digits (3 or more digits are fine).

I tried this regex with negative lookahead

sometext($|\W(?!\d{1,2}))

but didn't get too far.

Upvotes: 2

Views: 67

Answers (3)

The fourth bird
The fourth bird

Reputation: 163297

You could make use of \W adding it to the negative lookahead:

sometext(?!\W*\d{1,2}\b)

See a regex 101 demo

Note that \W matches a non word character, which is more than only - / .


If you don't want to match 0 or more separators being one of - / . you might also use:

sometext(?![\s/.-]*\d{1,2}\b)

See another regex 101 demo

Upvotes: 1

Tim Biegeleisen
Tim Biegeleisen

Reputation: 521194

I would use the following negative lookahead approach:

sometext(?!(?:[/.-]|\s*)\d{1,2}\b)

This pattern says to match:

  • sometext match literal 'sometext'
  • (?! lookahead and negatively assert that
    • (?:[/.-]|\s*) what follows is not a /.- separator or zero or more whitespaces
    • \d{1,2}\b which is then followed by either one or two digits
  • ) end of lookahead

Demo

Upvotes: 1

Farhan
Farhan

Reputation: 87

Try this one

^sometext(?![\s\-\/\.]?\d{1,2})(?!\d)

Regex explanation:

  1. ^: Matches the start of the string.
  2. sometext: Matches the literal "sometext".
  3. (?![\s-/.]?\d{1,2}): Negative lookahead to ensure the next character(s) aren't: An optional separator ([\s-/.]?) followed by 1–2 digits (\d{1,2}).
  4. (?!\d): Another negative lookahead to prevent a digit immediately following "sometext".

Upvotes: 1

Related Questions