Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

C# Regexfråga

Jag försöker validera att ett textfält innehåller ett enkelt giltigt matematiskt uttryck i C# men får det inte att fungera.
Jag försöker med

bool validExpression = Regex.IsMatch(textBoxValue, @^(\d+([.,]\d+)?[*/+-])+(\d+([.,]\d+)?)$);

Och i alla online regex-testers så får jag resultatet jag vill men när jag använder det i c# så returnerar det alltid false.

Edit fnuttarna runt uttrycket försvinner när jag klistrar in i tråden men är där i verkligheten.

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av burton666:

Edit fnuttarna runt uttrycket försvinner när jag klistrar in i tråden men är där i verkligheten.

Använd [code]-taggar när du klistrar in kod, så blir den lättare att läsa (och använd Better SweClockers för att slippa skriva taggarna manuellt). Jag tror också att jag lyckats få regexet att se ut som du tänkt nedan:

bool validExpression = Regex.IsMatch(textBoxValue, @"^(\d+([.,]\d+)?[*/+-])+(\d+([.,]\d+)?)$" );

Att citattecknen inte syns i din kod gissar jag har att göra med att man kan använda @"Swenne Clockersnöt" för att tagga användare med mellanslag i sitt namn i forumet.

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

^\d+([.,]\d+)?[*/+-]\d+([.,]\d+)?$

matchar

1,2+3.4

enligt
http://regexstorm.net/tester

Du hade i alla fall en parantes och ett plus för mycket i mitten.

Om du vill ha samma decimalseparator på båda ställena får du nog hitta på någon backreference-historia.

Om det fortfarande inte fungerar i C# (jag har inte testat), börja med att plocka bort matchningen av radstart och radslut.

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av KAD:

^\d+([.,]\d+)?[*/+-]\d+([.,]\d+)?$

matchar

1,2+3.4

Detta matchar dock inte "1+2+3", vilket jag gissar att TS vill (men tyvärr har han inte gett några exempel på vad han vill matcha).

TS, utan att att ha någon aning om din tillämpning skulle jag nog för övrigt i allmänhet rekommendera att du bestämmer dig för ett decimaltecken (punkt eller komma), eller om möjligt kräver konsekvent användning genom hela uttrycket.

Testade för övrigt ditt ursprungliga regex på .NET Fiddle och förstår inte vad du menar med att det inte fungerar. Posta gärna ett MWE.

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

Håller med posten ovan, enklast om du bestämmer dig för . eller ,
Enklaste sättet jag kommer på är att kontrollera strängen innan den ska igenom din regex med en .Replace(',', '.')
för att på så vis byta ut alla komman mot punkter.

var regex = new Regex(@^(\d+([.,]\d+)?[*/+-])+(\d+([.,]\d+)?)$); var match1 = regex.Match("1,2+3"); var match2 = regex.Match("1.2*4"); var match3 = regex.Match("1.2 * 4"); var match4 = regex.Match("1*2+3-4"); var match5 = regex.Match("1*2+3/10"); match1.Success // true match2.Success // true match3.Success // false match4.Success // true match5.Success // true /* Fix för mellanslagen */ var input = "1.2 * 4"; var match6 = regex.Match(input.Replace(" ", "")); match6.Success // true

Så frågan är hur exakt du vill matcha det, du skulle som jag skrev ovan kunna köra en .Replace() och .Trim() för att ta bort alla mellanslag innan matchen också.