5

I've got a regex issue, I'm trying to ignore just the number '41', I want 4, 1, 14 etc to all match.

I've got this [^\b41\b] which is effectively what I want but this also ignores all single iterations of the values 1 and 4.

As an example, this matches "41", but I want it to NOT match: \b41\b

Alan Moore
  • 73,866
  • 12
  • 100
  • 156
Matt
  • 51
  • 1
  • 2

3 Answers3

5

Try something like:

\b(?!41\b)(\d+)

The (?!...) construct is a negative lookahead so this means: find a word boundary that is not followed by "41" and capture a sequence of digits after it.

cletus
  • 616,129
  • 168
  • 910
  • 942
1

You could use a negative look-ahead assertion to exclude 41:

/\b(?!41\b)\d+\b/

This regular expression is to be interpreted as: At any word boundary \b, if it is not followed by 41\b ((?!41\b)), match one or more digits that are followed by a word boundary.

Or the same with a negative look-behind assertion:

/\b\d+\b(?<!\b41)/

This regular expression is to be interpreted as: Match one or more digits that are surrounded by word boundaries, but only if the substring at the end of the match is not preceded by \b41 ((?<!\b41)).

Or can even use just basic syntax:

/\b(\d|[0-35-9]\d|\d[02-9]|\d{3,})\b/

This matches only sequences of digits surrounded by word boundaries of either:

  • one single digit
  • two digits that do not have a 4 at the first position or not a 1 at the second position
  • three or more digits
Gumbo
  • 643,351
  • 109
  • 780
  • 844
1

This is similar to the question "Regular expression that doesn’t contain certain string", so I'll repeat my answer from there:

^((?!41).)*$

This will work for an arbitrary string, not just 41. See my response there for an explanation.

Community
  • 1
  • 1
Grey Panther
  • 12,870
  • 6
  • 46
  • 64