At a very basic level the pattern means "contains"

Basic Examples

  • a|b* denotes { "a", "b", "bb", "bbb", ...}
  • (a|b)* denotes the set of all strings with no symbols other than "a" and "b", including the empty string: {"a", "b", "aa", "ab", "ba", "bb", "aaa", ...}
  • ab*(c|ε) denotes the set of strings starting with "a", then zero or more "b"s and finally optionally a "c": {"a", "ac", "ab", "abc", "abb", "abbc", ...}
  • (0|(1(01*0)*1))* denotes the set of binary numbers that are multiples of 3: { "0", "00", "11", "000", "011", "110", "0000", "0011", "0110", "1001", "1100", "1111", "00000", ... }

Advanced Examples

  • .at matches any three-character string ending with "at", including "hat", "cat", and "bat".
  • [hc]at matches "hat" and "cat".
  • [^b]at matches all strings matched by .at except "bat".
  • [^hc]at matches all strings matched by .at other than "hat" and "cat".
  • ^[hc]at matches "hat" and "cat", but only at the beginning of the string or line.
  • [hc]at$ matches "hat" and "cat", but only at the end of the string or line.
  • \[.\] matches any single character surrounded by "[" and "]" since the brackets are escaped, for example: "[a]" and "[b]".
  • s.* matches any number of characters preceded by s, for example: "saw" and "seed".

Negative Look-ahead

Sometimes you want to do some special regex that DOES NOT contain certain patterns but also DOES contain others. To do this you need the negative look-around operator (?...)

  • ^(?:(?!foobar).)*)$/ does not contain foobar
  • ^foo-(?:(?!bar).)*)$/ starts with foo does not contain bar
  • ^(?:(?!__).)*)$/ does not contain '__' - useful for matching device hostname only and no sub-elements