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 BABC .

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.



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