3

How to write regex which find word (without whitespace) that doesn't contain some chars (like * or #) and sentence also (like level10 or level2 - it should be also regex - level[0-9]+). It will be simple for chars excluded ([^\\s^#^*]+) but how to exclude this 'level' example too ?

I want to exclude chars AND level with number.

  1. Examples:
    • weesdlevel3fv - shouldn't match because of 'level3'
    • we3rlevelw4erw - should match - there is level without number
    • dfs3leveldfvws#3vd - shouldn't match - level is good, but '#' char appeared
    • level4#level levelw4_level - threat as two words because of whitespaces - only second one should match - no levels with number and no restricted chars like '#' or '*'
Archaon
  • 31
  • 3

2 Answers2

3

See this regex:

/(?<=\s)(?!\S*[#*])(?!\S*level[0-9])\S+/

Regex explanation:

  • (?<=\s) Asserts position after a whitespace sequence.
  • (?!\S*[#*]) Asserts that "#" or "*" is absent in the sequence.
  • (?!\S*level[0-9]) Asserts that level[0-9] is not matched in the sequence.
  • \S+Now that our conditionals pass, this sequence is valid. Go ahead and use \S+ or \S++ to match the entire sequence.

To use lookaheads more exclusively, you can add another (?!\S*<false_to_assert>) group.

View a regex demo!


For this specific case you can use a double negation trick:

/(?<=\s)(?!\S*level[0-9])[^\s#*]+(?=\s)/

Another regex demo.


Read more:

Community
  • 1
  • 1
Unihedron
  • 10,902
  • 13
  • 62
  • 72
  • Thanks for answer and explanation. I tried it at 'weesdlevel3fv we3rlevel4erw dfsdfv#levels3vd fvlevels3vd' - should match last word but match last 3 – Archaon Aug 06 '14 at 06:44
  • @Archaon In [tag:regex], a `word` is defined as a collection of `\w` (word characters `[A-Za-z0-9_]`) surrounded by `\W` (non-word characters). I _assume_ you meant that you are looking to match non-whitespace sequences (`\S`) between whitespaces (`\s`) then? – Unihedron Aug 06 '14 at 06:47
  • 1
    +1 for efficient use of [classic password validation technique](http://www.rexegg.com/regex-lookarounds.html). – zx81 Aug 06 '14 at 10:16
-1

you can simply OR the searches with the pipe character [^\s#*]+|level[0-9]+

Brad
  • 15,361
  • 6
  • 36
  • 57
Tag Groff
  • 177
  • 4