9 svar
96 visningar
Mattehejsan 62
Postad: 5 maj 18:21

Reguljärt uttryck

Hej! jag försöker skriva ett reguljärt uttryck som ska matcha ett aritmetiskt uttryck som: 

- Består av ett eller flera heltal som är åtskiljda av någon av operatorerna för de fyra räknesätten: +, -, *, /

- Heltalen kan ha inledande nollor

- I början av ett uttryck kan det finnas ett plus- eller minustecken, dock tillåts inte detta på tal i mitten av uttryck

 - En ekvation är två uttryck separerade av ett likhetstecken så bara ett likhetstecken får förekomma 

 

Mitt försök är: "^[+-]?[0-9]+([+-*/][0-9]+)*=[+-]?[0-9]+([-+*/][0-9]+)*$", men det passerar inte testerna vilket jag antar beror på att \ måste användas vid specialtecknena. Jag vet dock inte hur den används och skulle vara tacksam för lite hjälp!

thedifference 376
Postad: 5 maj 19:01

Har du provat regex101? Det kommer inte ge dig svaret, men det kommer säga till om du har ett ogiltigt regex. Sen när du fixat det kan du lätt använda sidan till att testa med.

Du har rätt i att du behöver "escapa" några specialtecken, precis som du säger genom att sätta \ framför. Sidan kommer visa vilka. Efter att ha fixat det så verkar ditt regex fungera bra. Fast det verkar inte ha stöd för variabler, så det är lite begränsat för ekvationer.

Laguna Online 30493
Postad: 5 maj 19:03 Redigerad: 5 maj 19:05

Man ska matcha ett uttryck, och sedan står det ekvation. Vet man att det måste förekomma ett likhetstecken?

- inuti klamrar [ ] tolkas nog speciellt. Prova att sätta minustecknet först eller sist.

 

Mattehejsan 62
Postad: 5 maj 19:12

Nej det måste inte kunna förekomma likhetstecken, jag har nu uppdaterat till: "^([\+\-]?\d+([\+\-\*/]\d+)*=[\+\-]?\d+([\+\-\*/]\d+)*)|([\+\-]?\d+([\+\-\*/]\d+)*)$" men det funkar fortfarande inte men nu borde väl tecknen behandlats rätt? Så jag förstår inte vart det blir fel.

Laguna Online 30493
Postad: 5 maj 19:14

Vet du att \d fungerar?

Mattehejsan 62
Postad: 5 maj 19:17

Testade nu med [0-9] istället, "^([\+\-]?[0-9]+([\+\-\*/][0-9]+)*=[\+\-]?[0-9]+([\+\-\*/][0-9]+)*)|([\+\-]?[0-9]+([\+\-\*/][0-9]+)*)$", och det blev ändå fel så kan inte bara berott på \d iallafall.

thedifference 376
Postad: 5 maj 19:35

Får du veta mer om dina tester än bara om de passeras eller inte?

Mattehejsan 62
Postad: 5 maj 19:39

Den enda information jag får är att testet misslyckas när det: Testar funktionen på många små strängar, men enligt mina gissningar är det det första testet och jag tror inte mitt regex fungerar alls.

Mattehejsan 62
Postad: 5 maj 20:21

18/-35

 *23

000=0

7=7=7

3.14159265358

Just nu matchar den följande uttryck fast den inte ska det, vet nån vad det kan bero på+

CurtJ 1201
Postad: 5 maj 20:58 Redigerad: 5 maj 22:18

Jag ger dig ett exempel

 

re.compile("^([+-]*\\d[\\+\\-\\*\\/]\\d)+$")

 

Den här säger att du startar med x eller - eller inget alls. * betyder 0 eller fler repetitioner. 

Sen har du \d som säger att du ska ha ett heltal, dubbla \ för att "escapa" det i strängen. 

Sen har du en grupp med de fyra operatorerna +-*/, alla escapade

Sen avslutar du med ett heltal igen 

Allt inneslutet i parentes med en repetitionsoperator(+) som anger att allt kan repeteras 1 eller fler gånger.

Start och stop (^$) behövs egentligen inte men det skadar inte heller. 

Kommer du vidare då? 

 

Rättning: Du behöver inte \\ för operatorerna. 

re.compile("^([+-]*\\d+[\+\-\*\/]\\d+)+$")

 

Rättning av rättning: Jo det behöver du (jag=tröttmössa)

Svara
Close