PDA

Volledige versie bekijken : Regex vaagje


xWouterx
%Europe/Berlin %437 %2008, 11:29
Ik ben niet zo goed met regex daarom dat ik hier eens kom kijken of iemand me kan helpen:

Ik wil van volgende string de regex hebben:
=LET(A:1)

A = alle hoofdletters van A tot Z waarvan ze 2 keer mogen voorkomen, dus:
=LET(AA:1)
=LET(BZ:1)
enz...

1 = alle cijfers van 0-9 waarvan ze meedere keren mogen voorkomen, dus:
=LET(A:10)
=LET(A:7)

=LET( en ) zijn vaste tekens maar LET mag ook in kleine letters

Voorlopig had ik al: /\=LET\(^[A-Z]|:|^[0-9]\)/

waarbij elke string goed is die er als vlgt uit ziet: =LET(A:0) tot =LET(AAA..AA:000...00)
Heeft iemand een idee hoe ik dit kan aanpassen tot hij klopt?

Dauntless
%Europe/Berlin %458 %2008, 11:59
var pattern:RegExp = /=(LET|let)\([A-Z]{1,2}:\d+\)/;


trace("true: ");
trace(pattern.test("=LET(A:10)"));
trace(pattern.test("=LET(A:7)"));
trace(pattern.test("=let(AA:1)"));
trace(pattern.test("=let(BZ:1)"));
trace(pattern.test("=LET(A:14656456)"));

trace("false: ");
trace(pattern.test("=LET(ABC:10)"));
trace(pattern.test("=LET(A:a)"));
trace(pattern.test("=LET(A8:1)"));
trace(pattern.test("=LET(:1)"));
trace(pattern.test("=LET(A:)"));


Het haakje is een meta char dus die moet je escapen (heb je niet op het einde gedaan). Je probeert nu te zeggen: "Dit mag er niet staan", maar het is veel eenvoudiger (en ik denk veiliger) om te zeggen: "dit moet er staan". Dus in plaats van ^[0-9] krijg je dan [A-Z].

Om aan te geven 'minimum x, maximum y' gebruik je {x,y}. Een + is enkel '1 of meer'.

En dan nog een / op het einde van je regex toevoegen en dan zou hij hetzelfde moeten zijn als de mijne :)

//EDIT
Pas je post niet aan terwijl ik reply! [:o)] Je zat er met je vorige poging immers nog vrij dicht bij :)

xWouterx
%Europe/Berlin %465 %2008, 12:10
Hehe dank je, ik denk dat ik net iets te snel om hulp vroeg :D
Ik had besloten om men regex stap voor stap op te bouwen en te testen :D


Bedankt, voor het antwoord... Ik versta ondertussen ook al wat meer van regex :-)

xWouterx
%Europe/Berlin %480 %2008, 12:31
Hoe kan ik volgende strings laten matchen met 1 regular expression:

=LET(A1:B1)
=let(A1:B1)
=Let(A1:B1)
=lEt(A1:B1)
... enzovoort
dus enkel de L E T letters mogen case insentive zijn, dit heb ik tot nu toe
/^\=LET\([A-Z]{1,2}\d{1,2}\;[A-Z]{1,2}\d{1,2}\)$/
Hoe moet ik het gedeelte van LET aanpassen zodat het klopt?

TheDutch
%Europe/Berlin %487 %2008, 12:42
Dat doe je zo:

^=(?i)let(?-i)\(A1:B1\)$


Case Insensitive: (?i)
Case Sensitive: (?-i)

Hier is een goede site om regex te leren: http://regular-expressions.com/ :)

xWouterx
%Europe/Berlin %488 %2008, 12:43
Dat doe je zo:


Case Insensitive: (?i)
Case Sensitive: (?-i)

Hier is een goede site om regex te leren: http://regular-expressions.com/ :)
Dank je, het klopt nu :D
En dank ej voor de link, zeker heel handig!

Mr. Black
%Europe/Berlin %490 %2008, 12:46
Ah, wat TheDutch zegt dus. :)