Skip to content

Reguljära uttryck Mystery Cache

Hidden : 3/15/2013
Difficulty:
4 out of 5
Terrain:
1.5 out of 5

Size: Size:   micro (micro)

Join now to view geocache location details. It's free!

Watch

How Geocaching Works

Please note Use of geocaching.com services is subject to the terms and conditions in our disclaimer.

Geocache Description:

Koordinaterna ovan är falska! / The coordinates above are false!

Svårighetsgraden är satt utifrån att de flesta inte kan eller ens har sett detta ämne tidigare.
Svårighetsgraden är troligen lägre för de med förkunskaper inom ämnet.


Inom datavetenskap är reguljära uttryck (på engelska regular expressions, ofta förkortat regex eller regexp) en notation för att beskriva vissa mängder av strängar. Ett uttryck består av en sträng som följer särskilda syntaxregler. Reguljära uttryck används i många texteditorer och programspråk för sökning och textmanipulation.

Den exakta syntaxen för reguljära uttryck kan variera. Men det finns några grundläggande begrepp är gemensamma för många tillämpningar.

I sin enklaste form är ett reguljärt uttryck ett enskilt tecken som matchar en delsträng som utgör själva tecknet. Exempelvis, det reguljära uttrycket "a" matchar tecknet "a" i ordet "katt". Med hjälp av operatorer kan man bygga ihop uttryck som matchar komplicerade mönster i strängar.

De grundläggande operationerna är:

  • Konkatenering beskrivs av en sekvens av deluttryck, exempelvis matchar sekvensen "hur" bokstaven "h" omedelbart följt av "u" omedelbart följt av "r", dvs strängen "hur".
  • Alternativ beskrivs av ett lodrätt streck, |. Det används för att matcha minst ett av två alternativ. Uttrycket "hund|katt" matchar både strängen "hund" och strängen "katt".
  • Upprepning används för att matcha ett uttryck som upprepas 0 eller flera gånger. Det markeras med en asterisk. Uttrycket "go*gle" matchar en oändlig mängd av strängar: "ggle", "gogle", "google", "gooogle", o.s.v.
  • Gruppering av uttryck kan göras med parenteser. Det används för att markera vilken prioritet (precedens) olika operatorer har. "G(äv|ef)le" matchar "Gävle" och "Gefle", till skillnad från "Gäv|efle" som matchar "Gäv" och "efle"

Dessutom förekommer i de flesta implementationer även:

  • Teckenklasser matchar ett av de tecken som beskrivs inom hakparenteserna. Till exempel matchar [btk]ok bok, tok och kok. Man kan även beskriva klassen med ett intervall, till exempel [a-z] eller [a-z1-9@.].
  • Jokertecken som anges av tecknet ".". Matchar vilket tecken som helst.
  • Fler varianter av upprepning. Till exempel "?" för att ange antingen 0 eller 1 upprepning och "+" används för att ange 1 eller flera upprepningar.

Exempel

Anta att vi vill hitta ett datum som är inbäddad i en text:
Anita skulle besöka Alfred klockan 19:20 2012-12-21 för att äta middag.

Vi kan då matcha datumet med uttrycket:
[0-9]+-[0-9]+-[0-9]+

Notera att detta även matchar exempelvis 0-0-0 eller 1234-493456-8645 som inte är korrekta datum. För att matcha ett korrekt datum kan man göra exempelvis:
(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])

Källa: Reguljära uttryck, Wikipedia.

Koordinaterna finns i texten ovan, använd de reguljära uttrycken här under för att få ut koordinaterna, efter lyckad matchning kommer koordinaterna att finnas i grupperingarna N1-N7, respektive E1-E7.

(?<=(?<=.(?=(?:[^@]+(?<=(?<N4>\d))@)))[\s\S]{505})(?<=(?<=.(?=(?:[\s\S]+\[\d-\d\]\+){2}-\[(?<N2>\d)))[\s\S]{100})(?<N1>6(?!4))[\s\S]{4}(?<=(?<N6>\d)(?=(?<N7>\d))\d{2})(?<N3>\d)[\s\S]+(?<N5>\d)[\s\S]*?$

^[\s\S]+?(?<E1>[1-9])(?:[\s\S]*?)(?:\]\+[\s\S]+?){3}(?<=(?<E3>\d))(?<E2>(?<!0)\d(?=-(?!0)))(?:(?<E5>[^\s])+)(?<=(?<E7>[\s\S])[\s\S]{3})[\s\S]+(?<=(?<=.(?=[\s\S]+?(?<=(?<E6>\d))\]\[)).{20})(?<E4>\d)

Uttrycken innehåller inga radbrytningar utan radbryts automatiskt av webbläsarna.

När du ska välja ett program eller webbsida att testa dina reguljära uttryck i så är det viktigt att den inte är baserad på javascript (många webbsidor är det, men inte alla), detta då javascript-implementationen av reguljära uttryck saknar stöd för några viktiga metoder som vi använder.
Det är också viktigt att det finns stöd för named groups och lookbehind.

De reguljära uttryck som används här för att räkna ut koordinaterna ger inte en rättvis bild av hur reguljära uttryck används i verkligheten, dom är överdrivna och tillkrånglade för att lösa just den här specifika uppgiften.

Additional Hints (Decrypt)

Pnpur: Eöe / Cvcr

Decryption Key

A|B|C|D|E|F|G|H|I|J|K|L|M
-------------------------
N|O|P|Q|R|S|T|U|V|W|X|Y|Z

(letter above equals below, and vice versa)