Regular Expressions
Atomgruppering
Sök…
Introduktion
Regelbundna icke-fånga grupper tillåter motorn att gå in i gruppen igen och försöka matcha något annat (t.ex. en annan växling eller matcha färre tecken när en kvantifierare används).
Atomgrupper skiljer sig från vanliga grupper som inte fångar in eftersom backtracking är förbjudet. När gruppen har avslutats kasseras all backtracking-information, så inga alternativa matchningar kan försökas.
Anmärkningar
En besittande kvantifierare uppför sig som en atomgrupp genom att motorn inte kan spåra över ett symbol eller en grupp.
Följande är likvärdiga vad gäller funktionalitet, även om vissa kommer att vara snabbare än andra:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Gruppera med (?>)
Använda en Atomic Group
Atomgrupper har formatet (?>...)
med ett ?>
Efter den öppna paren.
Tänk på följande exempeltext:
ABC
Regexet kommer att försöka matcha början på position 0 i texten, som är före A
i ABC
.
Om ett fall-okänsligt uttryck (?>a*)abc
A
(?>a*)abc
användes, skulle (?>a*)
A
(?>a*)
matcha 1 A
tecken och lämna
BC
som den återstående texten som ska matchas. (?>a*)
-gruppen lämnas och abc
försöks på den återstående texten, som inte matchar.
Motorn kan inte spåra in i atomgruppen, så strömpasset misslyckas. Motorn går till nästa position i texten, som skulle vara i position 1, som är efter A
och före B
på ABC
.
Regex (?>a*)abc
A
(?>a*)abc
försöks igen och (?>a*)
A
(?>a*)
matchar A
0 gånger och lämnar
BC
som den återstående texten som ska matchas. (?>a*)
-gruppen lämnas och abc
försöks, vilket misslyckas.
Återigen kan motorn inte spåra in atomgruppen, så strömpasset misslyckas. Regexet kommer att fortsätta att misslyckas tills alla positioner i texten har uttömts.
Använda en icke-atomgrupp
Vanliga grupper som inte fångar in har formatet (?:...)
med en ?:
efter den öppna paren.
Med samma samplingstext, men med det skiftlägeskänsliga uttrycket (?:a*)abc
istället, skulle en matchning inträffa eftersom backtracking tillåts ske.
Först kommer (?:a*)
A
(?:a*)
att konsumera bokstaven A
i texten
ABC
lämnar
BC
som den återstående texten som ska matchas. (?:a*)
-gruppen lämnas och abc
försöks på återstående text, som inte matchar.
Motorn backspårar in i gruppen (?:a*)
A
(?:a*)
och försöker matcha 1 färre tecken: I stället för att matcha 1 A
karaktär försöker den matcha 0 A
tecken och gruppen (?:a*)
A
(?:a*)
lämnas. Detta lämnar
ABC
som den återstående texten som ska matchas. Regex abc
nu matcha den återstående texten.
Annat exempeltext
Överväg den här texten med både atomgrupper och icke-atomgrupper (återigen, känslig och okänslig):
AAAABC
Regexet kommer att försöka matcha början på position 0 i texten, som är före den första A
i AAAABC
.
Mönstret som använder atomgruppen (?>a*)abc
A
(?>a*)abc
kan inte matcha, och uppträder nästan identiskt med det atomiska ABC
exemplet ovan: alla 4 av A
tecknen matchas först med (?>a*)
A
(?>a*)
(lämnar BC
som återstående text att matcha), och abc
inte matcha med den texten. Gruppen kan inte anges på nytt, så matchen misslyckas.
Mönstret med användning av den icke-atomgrupp (?:a*)abc
kommer att kunna matcha, beter på liknande sätt som den icke-atom ABC
exemplet ovan: alla fyra av de A
tecken är först matchas med (?:a*)
(lämnar BC
som återstående text att matcha), och abc
inte matcha på den texten. Gruppen kan vara kom in igen, så en mindre A
försöks: 3 A
tecken är matchade i stället för 4 (lämnar ABC
som den återstående texten till match), och abc
har förmåga att framgångsrikt matcha på den texten.