Sök…


Anmärkningar

För många programmerare är regexet ett slags magiskt svärd som de kastar för att lösa alla typer av textupptäckningssituationer. Men det här verktyget är inget magiskt, och även om det är fantastiskt vad det gör, är det inte ett fullständigt programmeringsspråk ( dvs. det är inte Turing-komplett).

Vad betyder "regelbundet uttryck"?

Regelbundna uttryck uttrycker ett språk som definieras av en vanlig grammatik som kan lösas med en nondeterministic finite automat (NFA), där matchning representeras av staterna.

En vanlig grammatik är den mest enkla grammatiken som den uttrycks av Chomsky Hierarchy .

Chomskys hierarki

Enkelt sagt uttrycks ett vanligt språk visuellt av vad en NFA kan uttrycka, och här är ett mycket enkelt exempel på NFA:

NFA-exempel

Och språket Regular Expression är en textlig representation av en sådan automat. Det sista exemplet uttrycks av följande regex:

^[01]*1$

Som matchar alla sträng som börjar med 0 eller 1 , upprepar 0 eller flera gånger, som slutar med en 1 . Med andra ord är det en regex som matchar udda siffror från deras binära representation.

Är alla regex faktiskt en vanlig grammatik?

Det är de faktiskt inte. Många regex-motorer har förbättrats och använder push-down automata , som kan stapla upp och visa information när den körs. Dessa automater definierar vad som kallas kontextfria grammatik i Chomskys hierarki. Den mest typiska användningen av dem i icke-regelbundet regex är användningen av ett rekursivt mönster för parentesmatchning.

Ett rekursivt regex som följande (som matchar parentes) är ett exempel på en sådan implementering:

{((?>[^\(\)]+|(?R))*)}

(detta exempel fungerar inte med Pythons re motor, utan med regex motorn eller med PCRE-motorn ).

Resurser

För mer information om teorin bakom Regular Expressions, kan du hänvisa till följande kurser tillgängliga av MIT:

När du skriver eller felsöker ett komplext regex finns det onlineverktyg som kan hjälpa till att visualisera regexer som automatik, som felsökningswebbplatsen .

versioner

PCRE

Version Släppte
2 2015/01/05
1 1997/06/01

Används av: PHP 4.2.0 (och högre), Delphi XE (och högre), Julia , Notepad ++

Perl

Version Släppte
1 1987/12/18
2 1988/06/05
3 1989/10/18
4 1991/03/21
5 1994/10/17
6 2009-07-28

.NETTO

Version Släppte
1 2002-02-13
4 2010-04-12

Språk: C #

Java

Version Släppte
4 2002-02-06
5 2004-10-04
7 2011-07-07
SE8 2014/03/18

JavaScript

Version Släppte
1,2 1997/06/11
1.8.5 2010-07-27

Pytonorm

Version Släppte
1,4 1996/10/25
2,0 2000/10/16
3,0 2008-12-03
3.5.2 2016/06/07

Oniguruma

Version Släppte
Första 2002-02-25
5.9.6 2014/12/12
Onigmo 2015/01/20

Lyft

Version Släppte
0 1999/12/14
1.61.0 2016/05/13

POSIX

Version Släppte
BRE 1997-01-01
ERE 2008-01-01

Språk: Bash

Teckenguide

Observera att vissa syntaxelement har olika beteenden beroende på uttrycket.

Syntax Beskrivning
? Matcha föregående karaktär eller subexpression 0 eller 1 gånger. Används även för grupper som inte fångar och namngav fångstgrupper.
* Matcha föregående karaktär eller subexpression 0 eller flera gånger.
+ Matcha föregående karaktär eller subexpression en eller flera gånger.
{n} Matcha föregående karaktär eller subexpression exakt n gånger.
{min,} Matcha föregående karaktär eller subexpression min eller flera gånger.
{,max} Matcha föregående karaktär eller subexpression max eller färre gånger.
{min,max} Matcha föregående karaktär eller subexpression minst min gånger men högst max gånger.
- När det ingår mellan fyrkantiga parenteser indikerar to ; t.ex. [3-6] matchar tecken 3, 4, 5 eller 6.
^ Start av strängen (eller början av raden om multiline /m alternativet är specificerat), eller avvisar en lista med alternativ (dvs om inom fyrkantiga parenteser [] )
$ Slut på strängen (eller slutet på en rad om alternativet multiline /m anges).
( ... ) Grupper subexpressions, fångar matchande innehåll i specialvariabler ( \1 , \2 , etc.) som kan användas senare inom samma regex, till exempel (\w+)\s\1\s matchar ordrepetition
(?<name> ... ) Grupper subexpressions och fångar dem i en namngiven grupp
(?: ... ) Grupper subexpressions utan att fånga
. Matchar alla tecken utom radbrytningar ( \n och vanligtvis \r ).
[ ... ] Alla tecken mellan dessa parenteser bör matchas en gång. OBS: ^ följer den öppna konsolen försvårar denna effekt. - inträffar inom parenteserna gör det möjligt att specificera ett intervall av värden (såvida det inte är det första eller sista tecknet, i vilket fall det bara representerar ett vanligt bindestreck).
\ Rymmer följande tecken. Används också i metasekvenser - regex-tokens med speciell betydelse.
\$ dollar (dvs en rymd specialtecken)
\( öppen parentes (dvs ett undkommet specialtecken)
\) nära parentes (dvs ett undkommet specialtecken)
\* asterisk (dvs en rymd specialtecken)
\. prick (dvs ett undkommet specialtecken)
\? frågetecken (dvs. ett undkommet specialtecken)
\[ vänster (öppen) fyrkantig konsol (dvs ett undkommet specialtecken)
\\ backslash (dvs ett undkommet specialtecken)
\] höger (nära) fyrkantig konsol (dvs ett undkommet specialtecken)
\^ caret (dvs en rymd specialtecken)
\{ vänster (öppen) lockig konsol / stag (dvs ett undkommet specialtecken)
\| rör (dvs ett undkommet specialtecken)
\} höger (nära) lockigt konsol / stag (dvs ett undkommet specialtecken)
\+ plus (dvs en rymd specialtecken)
\A början på en sträng
\Z slutet av en sträng
\z absolut av en sträng
\b ordgräns (alfanumerisk sekvens)
\1 , \2 , etc. bakreferenser till tidigare matchade subexpressions, grupperade efter () , \1 betyder den första matchen, \2 betyder andra match etc.
[\b] backspace - när \b är inne i en teckenklass ( [] ) matchar backspace
\B negated \b - matchar på vilken position som helst mellan två ordstecken och på vilken position som helst mellan två icke-ordstecken
\D icke-siffriga
\d siffra
\e fly
\f bilda foder
\n radmatning
\r vagnretur
\S non-white-space
\s white-space
\t flik
\v vertikal flik
\W icke-ord
\w ord (dvs alfanumeriskt tecken)
{ ... } namngivna teckenuppsättning
| eller; dvs avgränsar de föregående och föregående alternativen.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow