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
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
  • Match everything enclosed
    (?:...)
  • Capture everything enclosed
    (...)
  • 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

/
/
gm

Test String

Code Generator

Generated Code

$re = '/(\/\/.*+|\/[*]{1,2}([^*]*[^*\/]|\R++|[*]+[^*\/])*[*]\/)/m'; $str = '// This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/10/ArrayTest/Main.jack // (identical to projects/09/Average/Main.jack) /** Computes the average of a sequence of integers. */ class Main { function void main() { var Array a; var int length; var int i, sum; let length = Keyboard.readInt("HOW MANY NUMBERS? "); let a = Array.new(length); let i = 0; while (i < length) { let a[i] = Keyboard.readInt("ENTER THE NEXT NUMBER: "); let i = i + 1; } let i = 0; let sum = 0; while (i < length) { let sum = sum + a[i]; let i = i + 1; } do Output.printString("THE AVERAGE IS: "); do Output.printInt(sum / length); do Output.println(); return; } } // This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/10/ExpressionLessSquare/Main.jack /** Expressionless version of projects/10/Square/Main.jack. */ class Main { static boolean test; // Added for testing -- there is no static keyword // in the Square files. function void main() { var SquareGame game; let game = game; do game.run(); do game.dispose(); return; } function void more() { // Added to test Jack syntax that is not used in var boolean b; // the Square files. if (b) { } else { // There is no else keyword in the Square files. } return; } } // This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. /// File name: projects/10/ExpressionLessSquare/Square.jack /** Expressionless version of projects/10/Square/Square.jack. */ class Square { field int x, y; field int size; constructor Square new(int Ax, int Ay, int Asize) { let x = Ax; let y = Ay; let size = Asize; do draw(); return x; } method void dispose() { do Memory.deAlloc(this); return; } method void draw() { do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); return; } method void erase() { do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); return; } method void incSize() { if (x) { do erase(); let size = size; do draw(); } return; } method void decSize() { if (size) { do erase(); let size = size; do draw(); } return; } method void moveUp() { if (y) { do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); let y = y; do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); } return; } method void moveDown() { if (y) { do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); let y = y; do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); } return; } method void moveLeft() { if (x) { do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); let x = x; do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); } return; } method void moveRight() { if (x) { do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); let x = x; do Screen.setColor(x); do Screen.drawRectangle(x, y, x, y); } return; } } // This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/10/ExpressionLessSquare/SquareGame.jack /** Expressionless version of projects/10/Square/SquareGame.jack. */ class SquareGame { field Square square; field int direction; constructor SquareGame new() { let square = square; let direction = direction; return square; } method void dispose() { do square.dispose(); do Memory.deAlloc(square); return; } method void moveSquare() { if (direction) { do square.moveUp(); } if (direction) { do square.moveDown(); } if (direction) { do square.moveLeft(); } if (direction) { do square.moveRight(); } do Sys.wait(direction); return; } method void run() { var char key; var boolean exit; let exit = key; while (exit) { while (key) { let key = key; do moveSquare(); } if (key) { let exit = exit; } if (key) { do square.decSize(); } if (key) { do square.incSize(); } if (key) { let direction = exit; } if (key) { let direction = key; } if (key) { let direction = square; } if (key) { let direction = direction; } while (key) { let key = key; do moveSquare(); } } return; } } // This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/10/Square/Main.jack // (derived from projects/09/Square/Main.jack, with testing additions) /** Initializes a new Square Dance game and starts running it. */ class Main { static boolean test; // Added for testing -- there is no static keyword // in the Square files. function void main() { var SquareGame game; let game = SquareGame.new(); do game.run(); do game.dispose(); return; } function void more() { // Added to test Jack syntax that is not used in var int i, j; // the Square files. var String s; var Array a; if (false) { let s = "string constant"; let s = null; let a[1] = a[2]; } else { // There is no else keyword in the Square files. let i = i * (-j); let j = j / (-2); // note: unary negate constant 2 let i = i | j; } return; } } // This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/10/Square/Square.jack // (same as projects/09/Square/Square.jack) /** Implements a graphical square. */ class Square { field int x, y; // screen location of the square\'s top-left corner field int size; // length of this square, in pixels /** Constructs a new square with a given location and size. */ constructor Square new(int Ax, int Ay, int Asize) { let x = Ax; let y = Ay; let size = Asize; do draw(); return this; } /** Disposes this square. */ method void dispose() { do Memory.deAlloc(this); return; } /** Draws the square on the screen. */ method void draw() { do Screen.setColor(true); do Screen.drawRectangle(x, y, x + size, y + size); return; } /** Erases the square from the screen. */ method void erase() { do Screen.setColor(false); do Screen.drawRectangle(x, y, x + size, y + size); return; } /** Increments the square size by 2 pixels. */ method void incSize() { if (((y + size) < 254) & ((x + size) < 510)) { do erase(); let size = size + 2; do draw(); } return; } /** Decrements the square size by 2 pixels. */ method void decSize() { if (size > 2) { do erase(); let size = size - 2; do draw(); } return; } /** Moves the square up by 2 pixels. */ method void moveUp() { if (y > 1) { do Screen.setColor(false); do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); let y = y - 2; do Screen.setColor(true); do Screen.drawRectangle(x, y, x + size, y + 1); } return; } /** Moves the square down by 2 pixels. */ method void moveDown() { if ((y + size) < 254) { do Screen.setColor(false); do Screen.drawRectangle(x, y, x + size, y + 1); let y = y + 2; do Screen.setColor(true); do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); } return; } /** Moves the square left by 2 pixels. */ method void moveLeft() { if (x > 1) { do Screen.setColor(false); do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); let x = x - 2; do Screen.setColor(true); do Screen.drawRectangle(x, y, x + 1, y + size); } return; } /** Moves the square right by 2 pixels. */ method void moveRight() { if ((x + size) < 510) { do Screen.setColor(false); do Screen.drawRectangle(x, y, x + 1, y + size); let x = x + 2; do Screen.setColor(true); do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); } return; } } // This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/10/Square/SquareGame.jack // (same as projects/09/Square/SquareGame.jack) /** * Implements the Square Dance game. * This simple game allows the user to move a black square around * the screen, and change the square\'s size during the movement. * When the game starts, a square of 30 by 30 pixels is shown at the * top-left corner of the screen. The user controls the square as follows. * The 4 arrow keys are used to move the square up, down, left, and right. * The \'z\' and \'x\' keys are used, respectively, to decrement and increment * the square\'s size. The \'q\' key is used to quit the game. */ class SquareGame { field Square square; // the square of this game field int direction; // the square\'s current direction: // 0=none, 1=up, 2=down, 3=left, 4=right /** Constructs a new Square Game. */ constructor SquareGame new() { // Creates a 30 by 30 pixels square and positions it at the top-left // of the screen. let square = Square.new(0, 0, 30); let direction = 0; // initial state is no movement return this; } /** Disposes this game. */ method void dispose() { do square.dispose(); do Memory.deAlloc(this); return; } /** Moves the square in the current direction. */ method void moveSquare() { if (direction = 1) { do square.moveUp(); } if (direction = 2) { do square.moveDown(); } if (direction = 3) { do square.moveLeft(); } if (direction = 4) { do square.moveRight(); } do Sys.wait(5); // delays the next movement return; } /** Runs the game: handles the user\'s inputs and moves the square accordingly */ method void run() { var char key; // the key currently pressed by the user var boolean exit; let exit = false; while (~exit) { // waits for a key to be pressed while (key = 0) { let key = Keyboard.keyPressed(); do moveSquare(); } if (key = 81) { let exit = true; } // q key if (key = 90) { do square.decSize(); } // z key if (key = 88) { do square.incSize(); } // x key if (key = 131) { let direction = 1; } // up arrow if (key = 133) { let direction = 2; } // down arrow if (key = 130) { let direction = 3; } // left arrow if (key = 132) { let direction = 4; } // right arrow // waits for the key to be released while (~(key = 0)) { let key = Keyboard.keyPressed(); do moveSquare(); } } // while return; } } '; preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); // Print the entire match result var_dump($matches);

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 PHP, please visit: http://php.net/manual/en/ref.pcre.php