Forum » Programiranje » c# regularni izraz
c# regularni izraz
bombacina ::
Imam string 822,35 &eur; in bi rad s pomocjo regexa dobil nazaj samo 822,35.
Kaksen mora biti regex da dobim nazaj samo vrednost, &eur; pa se poreze.
Hvala
Kaksen mora biti regex da dobim nazaj samo vrednost, &eur; pa se poreze.
Hvala
Jean-Paul ::
Sam ne delam v C#. Poskusi namesto enega backslasha uporabiti dva, takole:
\\d+,\\d{2}
Poglej še na msdn
\\d+,\\d{2}
Poglej še na msdn
Zgodovina sprememb…
- spremenil: Jean-Paul ()
bombacina ::
hvala samo mi se vedno vraca no match in ne izpise iz danega stringa 822,35 &eur; ven 822.35.
Imas se kaksno idejo?
Hvala
Imas se kaksno idejo?
Hvala
bombacina ::
static void Main(string[] args) { Regex rx = new Regex(@"\\d+,\\d{2}"); string test = "822 &eur;"; if (rx.IsMatch(test)) { Console.WriteLine("{0} is a value.", test); } else { Console.WriteLine("{0} is not a value.", test); } Console.ReadLine(); }
Koda kjer testiram ta regex... Rad bi napisal regex, ki pobere vse razen string " &eur;" ali pa prebere samo stevilko iz stringa. Ker cena je lahko 2,3 ali 4 mestna...
Hvala za pomoc
Zgodovina sprememb…
- spremenil: bombacina ()
Senzacionale ::
res nisem najboljši v regexu ampak vseeno. Tako prebereš 857 žal pa ne 857,22. Upam da pozna kdo točnejšo rešitev ki prebere 857,22
Regex exp = new Regex(@"\d+", RegexOptions.IgnoreCase); string InputText = "857,22 &eur;"; MatchCollection MatchList = exp.Matches(InputText); Match FirstMatch = MatchList[0]; Console.WriteLine(FirstMatch.Value);
http://www.dostavahrane.si
bombacina ::
hvala senzacionale, to vrne 857 in 22 rad pa bi tocno tako kot si rekel da vrne 857,22
Hvala
Hvala
fiction ::
Pa zakaj zaboga komplicirate z regexpi?!
A ni nekaj v stilu:
Drugace pa obstaja pri double.Parse() tudi parameter NumberStyles.
Uporaba bi bila nekako v stilu:
A ni nekaj v stilu:
double d; int idx = str.LastIndexOf(' '); if (idx > 0) { d = Convert.ToDouble(str.Substring(0, idx)); } else { d = 0D; }cisto dovolj?
Drugace pa obstaja pri double.Parse() tudi parameter NumberStyles.
Uporaba bi bila nekako v stilu:
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo (System.Threading.Thread.CurrentThread.CurrentCulture.LCID); ci.NumberFormat.CurrencySymbol = "€"; System.Threading.Thread.CurrentThread.CurrentCulture = ci; /***********************************************************/ double d = double.Parse(str, System.Globalization.NumberStyles.Currency);
fiction ::
fiction vem da so boljse druge opcije samo mora biti z regex, vem glupo...A to mate kaksno nalogo al kaj? Kdorkoli si je zmislil tole, je dal cisto "non-realworld" ali pa raje "braindamaged" primer, ker je z regularnimi izrazi precej overheada (ne mislim s programerskega stalisca, ampak to, da se stvar prevede v avtomat itd).
Mogoce bi slo kaj takega:
System.Text.RegularExpressions.Regex exp = new System.Text.RegularExpressions.Regex(@"(\d+(,\d{2})?).*", System.Text.RegularExpressions.RegexOptions.IgnoreCase); System.Text.RegularExpressions.Match match = exp.Match(str); if (match.Success) { Console.WriteLine(match.Groups[1]); }
Bistvo je najbrz v tem, da razumes kako z regularnim izrazom opises niz. "\d"
pomeni eno stevko, "+" pa da je ena ali vec. Potem pride "(..)?" - kar pomeni tisto v oklepaju ... mora biti 0 ali 1x prisotno. Tisto notri ... je pa "," in dve stevilki. {2} za \d pomeni tocno dvakrat.
Se pravi lahko je samo \d+ npr. 1337 lahko je pa \d+,\d{2} npr. 133,37.
.* na koncu pomeni karkoli, oklepaji okrog tistega prej so pa zato da dobis skupino. Lahko bi pa vse skupaj opisal se na kaksen drug nacin.
Drugace bi se dalo regexp uporabiti samo za replace in zamenjati v nizu vse kar ni \d oz. "," s praznim nizem (string.Empty) - se pravi odstraniti vse cudne znake (pri tebi bosta to presledek in znak za valuto).
BigWhale ::
Cudn jezik uporabljas. (\d+,\d+) mora ze sam po sebi delat. Ce ces bit bol natancen potem uporabis (\d+,\d{2}).
import re m = re.search('(\d+,\d+)', '3323,42E') print m.group(0) '3323,42' m = re.search('(\d+,\d{2})', '3323,42E') print m.group(0) '3323,42'
BlueRunner ::
Čakajte malo... če prav vidim kodo, potem želi ujeti 822€ in 822,35€. Morda pa tudi 822,3€.
Predlagam @"(\d+(?:,\d+)"
Predlagam @"(\d+(?:,\d+)"
hunter01 ::
Tukaj maš sample kako dobiti vrednost ven v C#
Problem tukaj je da če boš mel vpisano npr string: "323k23,45E" ti bo ta regex vrnu 23,45E, tukaj bi mogu še kako dodatno preverjanje naredit, kateri znaki so samo dovoljeni.
Če misliš parsat več števil lahko daš v for zanko.
Jaz sem testiral to v asp.net tak da sem v label izpisoval si, ti pa uporabi kar pač rabiš :=)
Drugače pa regexe je dobro znat :D No vsaj meni se zdijo zelo koristni :)
EDIT: znak € v kodi zamenja v € tak da sem namesto € v kodi dal E
string stringText = "8,24E"; Regex cenaPattern = new Regex("(?<cena>\\d+.?\\d+)E|(?<cena>\\d+)E"); Match m = cenaPattern.Match(stringText); if (m.Success) { Label1.Text = m.Groups["cena"].ToString(); }
Problem tukaj je da če boš mel vpisano npr string: "323k23,45E" ti bo ta regex vrnu 23,45E, tukaj bi mogu še kako dodatno preverjanje naredit, kateri znaki so samo dovoljeni.
Če misliš parsat več števil lahko daš v for zanko.
string stringText = "85,4E; 222,34E; asda, 12E;"; Regex cenaPattern = new Regex("(?<cena>\\d+.?\\d+)E|(?<cena>\\d+)E"); for (Match m = cenaPattern.Match(stringText); m.Success; m = m.NextMatch()) { Label1.Text += m.Groups["cena"].ToString() + "<br />"; }
Jaz sem testiral to v asp.net tak da sem v label izpisoval si, ti pa uporabi kar pač rabiš :=)
Drugače pa regexe je dobro znat :D No vsaj meni se zdijo zelo koristni :)
EDIT: znak € v kodi zamenja v € tak da sem namesto € v kodi dal E
Zgodovina sprememb…
- spremenil: hunter01 ()
BlueRunner ::
Za primer "1€" ne bo našel zneska, kar je narobe.
Za primer "1b1€" bo našel "1b1", kar je tudi narobe.
Za primer "1b1€" bo našel "1b1", kar je tudi narobe.
hunter01 ::
Za primer "1€" ne bo našel zneska, kar je narobe.
Za primer "1b1€" bo našel "1b1", kar je tudi narobe.
1€ bo vrnu 1, kar je prav
glede 1b1 ja to je napaka moral bi vrnit 1.
Malo sem se še poigral, sprobaj to:
Regex cenaPattern = new Regex("(?<cena>^\\d+[,\\.]?\\d+)E|(?<cena>^\\d+)E);
Zdej bi pa moglo delat vse, tudi če daš 1b1 ne vrne nič. Delat bi pa moglo če vnesejo tako piko kot vejico pri ceni. (če je to sploh potrebno če ne zamenjaj: [,\\.] v ,
PS: V regularnem izrazu zamenjaj E z € zopet
Senzacionale ::
Točno BlueRunner
mora biti \ in ne dva, preverjeno z http://www.radsoftware.com.au/regexdesi...
\d+(,\d+)?
mora biti \ in ne dva, preverjeno z http://www.radsoftware.com.au/regexdesi...
http://www.dostavahrane.si
darkolord ::
Dva sta zato, ker morajo biti backslashi escapani, ko jih daš v string. Lahko imaš takole:
string reg = "\\d+(,\\d+)?";
ali
string reg = @"\d+(,\d+)?";
string reg = "\\d+(,\\d+)?";
ali
string reg = @"\d+(,\d+)?";
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
⊘ | [C#]polje znakovOddelek: Programiranje | 2384 (2212) | Ziga Dolhar |
» | Štetje besed v nizu (C#)Oddelek: Programiranje | 1067 (1005) | Spura |
» | branje iz datoteke c#Oddelek: Programiranje | 1648 (1377) | darkolord |
» | [C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene straniOddelek: Programiranje | 2754 (2364) | David1994 |
» | [c#] string.TrimOddelek: Programiranje | 1317 (1263) | darkolord |