Regular Expressions 101

Save & Share

Flavor

  • PCRE2 (PHP >=7.3)
  • PCRE (PHP <7.3)
  • ECMAScript (JavaScript)
  • Python
  • Golang
  • Java 8
  • .NET 7.0 (C#)
  • Rust
  • Regex Flavor Guide

Function

  • Match
  • Substitution
  • List
  • Unit Tests

Tools

Sponsors
There are currently no sponsors. Become a sponsor today!
An explanation of your regex will be automatically generated as you type.
Detailed match information will be displayed here automatically.
  • All Tokens
  • Common Tokens
  • General Tokens
  • Anchors
  • Meta Sequences
  • Quantifiers
  • Group Constructs
  • Character Classes
  • Flags/Modifiers
  • Substitution
  • A single character of: a, b or c
    [abc]
  • A character except: a, b or c
    [^abc]
  • A character in the range: a-z
    [a-z]
  • A character not in the range: a-z
    [^a-z]
  • A character in the range: a-z or A-Z
    [a-zA-Z]
  • Any single character
    .
  • Alternate - match either a or b
    a|b
  • Any whitespace character
    \s
  • Any non-whitespace character
    \S
  • Any digit
    \d
  • Any non-digit
    \D
  • Any word character
    \w
  • Any non-word character
    \W
  • Non-capturing group
    (?:...)
  • Capturing group
    (...)
  • Zero or one of a
    a?
  • Zero or more of a
    a*
  • One or more of a
    a+
  • Exactly 3 of a
    a{3}
  • 3 or more of a
    a{3,}
  • Between 3 and 6 of a
    a{3,6}
  • Start of string
    ^
  • End of string
    $
  • A word boundary
    \b
  • Non-word boundary
    \B

Regular Expression

/
/
g

Test String

Code Generator

Generated Code

import Foundation let pattern = #""" (?smx) (?(DEFINE) (?<jsonObject> \{(?&jsonField)(?>,(?&jsonField))*+\}| \{[[:space:]]*+\} ) (?<jsonArray> \[(?&jsonValue)(?>,(?&jsonValue))*+\]| \[[[:space:]]*+\] ) (?<string> " [^"\\]*+ (?> (?> \\["\\\/rntfb]| \\u[[:xdigit:]]{4} )++ [^"\\]*+ )*+ " ) (?<number> \-?+ (?> [1-9][[:digit:]]*+| 0 ) (?>\.[[:digit:]]++)?+ (?>[eE][\+\-]?+[[:digit:]]++)?+ ) (?<jsonValue> [[:space:]]*+ (?> (?&string)| (?&number)| (?&jsonObject)| (?&jsonArray)| false| true| null ) [[:space:]]*+ ) (?<jsonField> [[:space:]]*+(?&string)[[:space:]]*+\: (?&jsonValue) ) ) ^(?&jsonValue),\n """# let regex = try! NSRegularExpression(pattern: pattern) let testString = ##""" null, null, null , null , false, false, false , false , true, true, true , true , 123, 0, -123, -0, 123.0, 0.0, -123.0, -0.0, 123e1, 0e1, -123e1, -0e1, 123.0e1, 0.0e1, -123.0e1, -0.0e1, 123e+1, 0e+1, -123e+1, -0e+1, 123.0e+1, 0.0e+1, -123.0e+1, -0.0e+1, 123e-1, 0e-1, -123e-1, -0e-1, 123.0e-1, 0.0e-1, -123.0e-1, -0.0e-1, 123E1, 0E1, -123E1, -0E1, 123.0E1, 0.0E1, -123.0E1, -0.0E1, 123E+1, 0E+1, -123E+1, -0E+1, 123.0E+1, 0.0E+1, -123.0E+1, -0.0E+1, 123E-1, 0E-1, -123E-1, -0E-1, 123.0E-1, 0.0E-1, -123.0E-1, -0.0E-1, 123, 0, -123, -0, 123.0, 0.0, -123.0, -0.0, 123e1, 0e1, -123e1, -0e1, 123.0e1, 0.0e1, -123.0e1, -0.0e1, 123e+1, 0e+1, -123e+1, -0e+1, 123.0e+1, 0.0e+1, -123.0e+1, -0.0e+1, 123e-1, 0e-1, -123e-1, -0e-1, 123.0e-1, 0.0e-1, -123.0e-1, -0.0e-1, 123E1, 0E1, -123E1, -0E1, 123.0E1, 0.0E1, -123.0E1, -0.0E1, 123E+1, 0E+1, -123E+1, -0E+1, 123.0E+1, 0.0E+1, -123.0E+1, -0.0E+1, 123E-1, 0E-1, -123E-1, -0E-1, 123.0E-1, 0.0E-1, -123.0E-1, -0.0E-1, 123 , 0 , -123 , -0 , 123.0 , 0.0 , -123.0 , -0.0 , 123e1 , 0e1 , -123e1 , -0e1 , 123.0e1 , 0.0e1 , -123.0e1 , -0.0e1 , 123e+1 , 0e+1 , -123e+1 , -0e+1 , 123.0e+1 , 0.0e+1 , -123.0e+1 , -0.0e+1 , 123e-1 , 0e-1 , -123e-1 , -0e-1 , 123.0e-1 , 0.0e-1 , -123.0e-1 , -0.0e-1 , 123E1 , 0E1 , -123E1 , -0E1 , 123.0E1 , 0.0E1 , -123.0E1 , -0.0E1 , 123E+1 , 0E+1 , -123E+1 , -0E+1 , 123.0E+1 , 0.0E+1 , -123.0E+1 , -0.0E+1 , 123E-1 , 0E-1 , -123E-1 , -0E-1 , 123.0E-1 , 0.0E-1 , -123.0E-1 , -0.0E-1 , 123 , 0 , -123 , -0 , 123.0 , 0.0 , -123.0 , -0.0 , 123e1 , 0e1 , -123e1 , -0e1 , 123.0e1 , 0.0e1 , -123.0e1 , -0.0e1 , 123e+1 , 0e+1 , -123e+1 , -0e+1 , 123.0e+1 , 0.0e+1 , -123.0e+1 , -0.0e+1 , 123e-1 , 0e-1 , -123e-1 , -0e-1 , 123.0e-1 , 0.0e-1 , -123.0e-1 , -0.0e-1 , 123E1 , 0E1 , -123E1 , -0E1 , 123.0E1 , 0.0E1 , -123.0E1 , -0.0E1 , 123E+1 , 0E+1 , -123E+1 , -0E+1 , 123.0E+1 , 0.0E+1 , -123.0E+1 , -0.0E+1 , 123E-1 , 0E-1 , -123E-1 , -0E-1 , 123.0E-1 , 0.0E-1 , -123.0E-1 , -0.0E-1 , "", "zyxwvuts", "\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD", "zyxwvutszyxwvuts", "zyxwvuts\\\/\r\n\t\f\b", "zyxwvuts\u1234\uabcd\uABCD", "\\\/\r\n\t\f\bzyxwvuts", "\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "\u1234\uabcd\uABCDzyxwvuts", "\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "zyxwvutszyxwvutszyxwvuts", "zyxwvuts\\\/\r\n\t\f\bzyxwvuts", "zyxwvuts\u1234\uabcd\uABCDzyxwvuts", "\\\/\r\n\t\f\bzyxwvutszyxwvuts", "\\\/\r\n\t\f\b\\\/\r\n\t\f\bzyxwvuts", "\\\/\r\n\t\f\b\u1234\uabcd\uABCDzyxwvuts", "\u1234\uabcd\uABCDzyxwvutszyxwvuts", "\u1234\uabcd\uABCD\\\/\r\n\t\f\bzyxwvuts", "\u1234\uabcd\uABCD\u1234\uabcd\uABCDzyxwvuts", "zyxwvutszyxwvuts\\\/\r\n\t\f\b", "zyxwvuts\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "zyxwvuts\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "\\\/\r\n\t\f\bzyxwvuts\\\/\r\n\t\f\b", "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "\u1234\uabcd\uABCDzyxwvuts\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "zyxwvutszyxwvuts\u1234\uabcd\uABCD", "zyxwvuts\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "zyxwvuts\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "\\\/\r\n\t\f\bzyxwvuts\u1234\uabcd\uABCD", "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "\u1234\uabcd\uABCDzyxwvuts\u1234\uabcd\uABCD", "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "", "zyxwvuts", "\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD", "zyxwvutszyxwvuts", "zyxwvuts\\\/\r\n\t\f\b", "zyxwvuts\u1234\uabcd\uABCD", "\\\/\r\n\t\f\bzyxwvuts", "\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "\u1234\uabcd\uABCDzyxwvuts", "\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "zyxwvutszyxwvutszyxwvuts", "zyxwvuts\\\/\r\n\t\f\bzyxwvuts", "zyxwvuts\u1234\uabcd\uABCDzyxwvuts", "\\\/\r\n\t\f\bzyxwvutszyxwvuts", "\\\/\r\n\t\f\b\\\/\r\n\t\f\bzyxwvuts", "\\\/\r\n\t\f\b\u1234\uabcd\uABCDzyxwvuts", "\u1234\uabcd\uABCDzyxwvutszyxwvuts", "\u1234\uabcd\uABCD\\\/\r\n\t\f\bzyxwvuts", "\u1234\uabcd\uABCD\u1234\uabcd\uABCDzyxwvuts", "zyxwvutszyxwvuts\\\/\r\n\t\f\b", "zyxwvuts\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "zyxwvuts\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "\\\/\r\n\t\f\bzyxwvuts\\\/\r\n\t\f\b", "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "\u1234\uabcd\uABCDzyxwvuts\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\\\/\r\n\t\f\b", "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\\\/\r\n\t\f\b", "zyxwvutszyxwvuts\u1234\uabcd\uABCD", "zyxwvuts\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "zyxwvuts\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "\\\/\r\n\t\f\bzyxwvuts\u1234\uabcd\uABCD", "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "\u1234\uabcd\uABCDzyxwvuts\u1234\uabcd\uABCD", "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\u1234\uabcd\uABCD", "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\u1234\uabcd\uABCD", "" , "zyxwvuts" , "\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD" , "zyxwvutszyxwvuts" , "zyxwvuts\\\/\r\n\t\f\b" , "zyxwvuts\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\bzyxwvuts" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCDzyxwvuts" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , "zyxwvutszyxwvutszyxwvuts" , "zyxwvuts\\\/\r\n\t\f\bzyxwvuts" , "zyxwvuts\u1234\uabcd\uABCDzyxwvuts" , "\\\/\r\n\t\f\bzyxwvutszyxwvuts" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\bzyxwvuts" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCDzyxwvuts" , "\u1234\uabcd\uABCDzyxwvutszyxwvuts" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\bzyxwvuts" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCDzyxwvuts" , "zyxwvutszyxwvuts\\\/\r\n\t\f\b" , "zyxwvuts\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "zyxwvuts\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\bzyxwvuts\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCDzyxwvuts\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "zyxwvutszyxwvuts\u1234\uabcd\uABCD" , "zyxwvuts\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "zyxwvuts\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\bzyxwvuts\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCDzyxwvuts\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , "" , "zyxwvuts" , "\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD" , "zyxwvutszyxwvuts" , "zyxwvuts\\\/\r\n\t\f\b" , "zyxwvuts\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\bzyxwvuts" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCDzyxwvuts" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , "zyxwvutszyxwvutszyxwvuts" , "zyxwvuts\\\/\r\n\t\f\bzyxwvuts" , "zyxwvuts\u1234\uabcd\uABCDzyxwvuts" , "\\\/\r\n\t\f\bzyxwvutszyxwvuts" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\bzyxwvuts" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCDzyxwvuts" , "\u1234\uabcd\uABCDzyxwvutszyxwvuts" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\bzyxwvuts" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCDzyxwvuts" , "zyxwvutszyxwvuts\\\/\r\n\t\f\b" , "zyxwvuts\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "zyxwvuts\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\bzyxwvuts\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCDzyxwvuts\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\\\/\r\n\t\f\b" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\\\/\r\n\t\f\b" , "zyxwvutszyxwvuts\u1234\uabcd\uABCD" , "zyxwvuts\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "zyxwvuts\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\bzyxwvuts\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\b\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "\\\/\r\n\t\f\b\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCDzyxwvuts\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCD\\\/\r\n\t\f\b\u1234\uabcd\uABCD" , "\u1234\uabcd\uABCD\u1234\uabcd\uABCD\u1234\uabcd\uABCD" , {}, { }, {"1":1}, { "1" : 1 }, {"1":1,"2":2}, { "1" : 1, "2" : 2 }, {}, { }, {"1":1}, { "1" : 1 }, {"1":1,"2":2}, { "1" : 1, "2" : 2 }, {} , { } , {"1":1} , { "1" : 1 } , {"1":1,"2":2} , { "1" : 1, "2" : 2 } , {} , { } , {"1":1} , { "1" : 1 } , {"1":1,"2":2} , { "1" : 1, "2" : 2 } , [], [ ], [1], [ 1 ], [1,2], [ 1, 2 ], [], [ ], [1], [ 1 ], [1,2], [ 1, 2 ], [] , [ ] , [1] , [ 1 ] , [1,2] , [ 1, 2 ] , [] , [ ] , [1] , [ 1 ] , [1,2] , [ 1, 2 ] , {"x":{}}, {"x":[]}, { "x" : {} }, { "x" : [] }, [{}], [[]], [ { } ], [ [ ] ], {"x":{}}, {"x":[]}, { "x" : {} }, { "x" : [] }, [{}], [[]], [ { } ], [ [ ] ], {"x":{}} , {"x":[]} , { "x" : {} } , { "x" : [] } , [{}] , [[]] , [ { } ] , [ [ ] ] , {"x":{}} , {"x":[]} , { "x" : {} } , { "x" : [] } , [{}] , [[]] , [ { } ] , [ [ ] ] , #values to NOT match Null, False, True, 01, +1, 1., " " ", " \ ", " \x ", ""x, """## let stringRange = NSRange(location: 0, length: testString.utf16.count) let matches = regex.matches(in: testString, range: stringRange) var result: [[String]] = [] for match in matches { var groups: [String] = [] for rangeIndex in 1 ..< match.numberOfRanges { let nsRange = match.range(at: rangeIndex) guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue } let string = (testString as NSString).substring(with: nsRange) groups.append(string) } if !groups.isEmpty { result.append(groups) } } print(result)

Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression