Regular Expressions 101

Save & Manage Regex

  • Current Version: 8
  • Save & Share
  • Community Library

Flavor

  • PCRE2 (PHP)
  • ECMAScript (JavaScript)
  • Python
  • Golang
  • Java
  • .NET 7.0 (C#)
  • Rust
  • PCRE (Legacy)
  • Regex Flavor Guide

Function

  • Match
  • Substitution
  • List
  • Unit Tests
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
  • 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
Processing...

Test String

Code Generator

Generated Code

// include the latest version of the regex crate in your Cargo.toml extern crate regex; use regex::Regex; fn main() { let regex = Regex::new(r#"(?x)(?(DEFINE) (?<AutoItString> "(?> [^"]+ | "" )*" # double quoted string | '(?> [^']+ | '' )*' # single quoted string ) # AutoIt string definition (?<CommentBlock> (?m) ^\h*\# (?>cs|comments-start)\b # start of comment block (?sU:(?>(?&CommentBlock)|.)*) # content of comment block (could be nested) ^\h*\#(?>ce|comments-end)\b.*\R # end of comment block ) (?<NonComment> (?> (?&AutoItString) | [^\;\r\n])* ) # anything what's not a single comment (?<SingleComment> (?m) ^ (?&NonComment)\K\;.*$) # a AutoIt single line comment (?<Comment> (?&CommentBlock) | (?&SingleComment) ) # all AutoIt comments ) (?&Comment)"#).unwrap(); let string = "#include <Array.au3> #include <WindowsConstants.au3> ;AlignComment by Andy @ www.autoit.de ;Aligns Comments where are introduced by a Semicolon ; (;~ won´t be aligned!) ; ;The Script should be placed in the Scite-Directory\\AlignComment\\AlignComment.au3 ; ;add following lines in the SciteUser.propreties-file (Scite\\Options\\open User-properties) ;if the #38 is occupied, please choose an other number, and replace all 38 ! ;# 38 AlignComment ;command.38.*.au3=\"$(autoit3dir)\\autoit3.exe\" \"$(SciteDefaultHome)\\AlignComment\\AlignComment.au3\" \"$(FilePath)\" ;command.name.38.*.au3=AlignComment ;command.save.before.38.*.au3=1 ;command.is.filter.38.*.au3=1 ;command.shortcut.38.*.au3=F4 ;replace F4 with any other non-used keyboard shortcut to start AlignComment ; ;After that, restart Scite, load a script with comments and press F4...thats all $faktor_align = 0.30 ;80% der Zeilen sind kürzer als die Kommentarposition... ;sendscite-commands ;http://www.autoitscript.com/forum/index.php?showtopic=25029&view=findpost&p=175714 #comments-start Aussen irgendwas #cs Innen nochwas #comments-end Innen wieder etwas #ce Aussen If $cmdline[0] = 0 Then ;kein Dateiname angegeben MsgBox(0, \"Error AlignComment.au3\", \"No File selected!\") Exit Else $Tidy_path = RegRead(\"HKEY_CLASSES_ROOT\\AutoIt3Script\\Shell\\Tidy\\Command\", \"\") $Tidy_path = StringTrimRight(StringReplace($Tidy_path, '\"', \"\"), 3) SendSciTE_Command('menucommand:106') ;\"Datei speichern\" der aktuell in Scite geöffneten Datei FileCopy($cmdline[1], $cmdline[1] & \".BAK\") ;Sicherungskopie erstellen If @error Then ;falls keine Sicherungskopie herzustellen ist, abbrechen MsgBox(0, \"Error AlignComment.au3\", \"No Backup Copy possible! Check \" & $cmdline[1]) Exit EndIf $workdir = StringLeft($cmdline[1], StringInStr($cmdline[1], \"\\\", 1, -1) - 1) ShellExecuteWait($Tidy_path, '\"' & $cmdline[1] & '\"', $workdir, Default, @SW_HIDE) $file = FileRead($cmdline[1]) ;Dateiinhalt zeilenweise lesen EndIf SendSciTE_Command('menucommand:104') ;reload SendSciTE_Command('menucommand:420') ;clear Output in Scite Console window ConsoleWrite(\"+ AlignComment by Andy @ www.autoit.de\" & @CRLF) ConsoleWrite(\"+ Orginal file copied to: \" & $cmdline[1] & \".BAK\" & @CRLF) $zeilen = StringSplit($file, @CRLF, 3) $alignvorgabe = StringRegExp($file, \"(?i)aligncomment\\s*=\\s*(\\d+)\", 3) ; findet aligncomment=44 im text $alignvorgabepos = 0 If IsArray($alignvorgabe) Then $alignvorgabepos = $alignvorgabe[0] EndIf ;~ _ArrayDisplay($zeilen) $anz = 0 ;position des kommentarzeichens ermitteln Dim $len[UBound($zeilen)] ; For $i = 0 To UBound($zeilen) - 1 ;jede einzelne zeile $string = StringRegExp($zeilen[$i], '((?:[^''\";]*([''\"]).*?\\2)*[^;]*)(;.*$)', 3) ; falls kommentar in zeile, ist dieser in $string[2], ansonsten string[0}=\"\" If $string = 1 Then ;kein Kommentar in der Zeile $l = StringLen($zeilen[$i]) ;länge ohne Kommentar If $l > 10 Then ;keine leerzeile $len[$i] = $l ;anzahl zeichen Else ;leerzeilen zählen (werden nicht mitberechnet) $anz += 1 EndIf Else ;kommentar in der Zeile enthalten $l = StringLen($string[0]) ; länge ohne Kommentar If $l > 10 Then ;nur wenn keine Kommentarzeile $len[$i] = $l ;zeilenlänge ohne kommentar Else ;kommentarzeilen werden auch nicht mitgezählt $anz += 1 EndIf EndIf Next _ArraySort($len, 1) ;array absteigend sortieren ;_ArrayDisplay($len) $c_pos = $len[Int($faktor_align * (UBound($len) - 1 - $anz))] ;position des kommentars, so dass 80% aller zeilen kleiner als die Kommentarposition ist If $c_pos < $alignvorgabepos Then $c_pos = $alignvorgabepos ;If $c_pos < 30 Then $c_pos = 30 ConsoleWrite(\" Comments at the end of a line are aligned at Position \" & $c_pos & @CRLF) ConsoleWrite(\" Whole line Comments are indented\" & @CRLF) $a = 'test ;' $Kom = \"\" ;Das ist ein Kommentar $leerstring = _stringrep(\" \", $c_pos) ;maximale anzahl leerzeichen $c_zeile = \"\" For $i = 0 To UBound($zeilen) - 1 ;anzahl zeilen $z = $zeilen[$i] ;einzelne Zeile $z = StringReplace($z, Chr(9), \" \") ;tabs ersetzen durch 4 leerzeichen (scite) $string = StringRegExp($z, '((?:[^''\";]*([''\"]).*?\\2)*[^;]*)(?:(;.*$)|.$)', 3) ; falls kommentar in zeile, ist dieser in $string[2], ansonsten string[0}=\"\" ohne kommentar ist $string=1 If UBound($string) <> 3 Then ;kein kommentar in dieser Zeile $c_zeile = $c_zeile & $z & @CRLF Else ;kommentar in der zeile enthalten $string[0] = StringStripWS($string[0], 2) ;leerzeichen entfernen $l = StringLen($string[0]) ;stringlänge ohne Kommentar If $l > $c_pos Or $string[0] = \"\" Or StringRegExp($string[0], '\\A(?m)(\\s+$)') = True Then ; kommentarzeile oder Zeile zu lang, kommentarzeilen werden eingerückt $c_zeile = $c_zeile & $z & @CRLF ;Zeile bleibt unverändert Else $l = StringLen($string[0]) $anz_lz = $c_pos - $l + 1 ;länge Code ohne Kommentar $c_zeile = $c_zeile & $string[0] & StringLeft($leerstring, $anz_lz) & $string[2] & @CRLF ;Kommentar wird ausgerichtet EndIf EndIf Next FileDelete($cmdline[1]) FileWrite($cmdline[1], $c_zeile) Sleep(100) SendSciTE_Command('menucommand:104') ;Script laden Exit (0) ;copied from Xenobiologists OrganizeIncludes ;=============================================================================== ; Description: Sending commands to SciTE interface ;=============================================================================== Func SendSciTE_Command($sCmd, $Wait_For_Return_Info = 0) Local $WM_COPYDATA = 74 Local $WM_GETTEXT = 0x000D Local $WM_GETTEXTLENGTH = 0x000E224 Local Const $SCI_GETLINE = 2153 Local $Scite_hwnd = WinGetHandle('DirectorExtension') ; Get SciTE DIrector Handle Local $My_Hwnd = GUICreate('AutoIt3-SciTE interface') ; Create GUI to receive SciTE info Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2)) ; Convert my Gui Handle to decimal $sCmd = ':' & $My_Dec_Hwnd & ':' & $sCmd ; Add dec my gui handle to commandline to tell SciTE where to send the return info ;~ ConsoleWrite('SciTE Command --> ' & $sCmd & @LF) Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']') DllStructSetData($CmdStruct, 1, $sCmd) Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr') DllStructSetData($COPYDATA, 1, 1) DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1) DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct)) DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _ 'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _ 'Ptr', DllStructGetPtr($COPYDATA)) GUIDelete($My_Hwnd) EndFunc ;==>SendSciTE_Command Func _stringrep($s, $k) ;zeichen, anzahl, schneller Ersatz für _stringrepeat() While StringLen($s) * 2 <= $k ;schneller ersatz für stringrepeat $s &= $s WEnd $s &= StringLeft($s, $k - StringLen($s)) Return $s EndFunc ;==>_stringrep"; // result will be an iterator over tuples containing the start and end indices for each match in the string let result = regex.captures_iter(string); for mat in result { println!("{:?}", mat); } }

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 Rust, please visit: https://docs.rs/regex/latest/regex/