» »

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

Jean-Paul ::

Nekaj v tem stilu:
\d+,\d{2}
ali ekvivalentno:
[0-9]+,[0-9]{2}

bombacina ::

hmm se vedno mi ne dela, mi lahko das cel primer...

Hvala

netanyahu ::

Jean-Paul ::

Sam ne delam v C#. Poskusi namesto enega backslasha uporabiti dva, takole:
\\d+,\\d{2}

Poglej še na msdn

Zgodovina sprememb…

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

darkolord ::

Pokaži tvojo kodo.

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…

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

fiction ::

Pa zakaj zaboga komplicirate z regexpi?! :)

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);

bombacina ::

fiction vem da so boljse druge opcije samo mora biti z regex, vem glupo...

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+)"

hunter01 ::

Tukaj maš sample kako dobiti vrednost ven v C#
        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.

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

BlueRunner ::

A ni potem "\\d+(,\\d+)?" enostavneje?

Senzacionale ::

Točno BlueRunner

\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+)?";


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo

[C#]polje znakov

Oddelek: Programiranje
112212 (2040) Ziga Dolhar
»

Štetje besed v nizu (C#)

Oddelek: Programiranje
51001 (939) Spura
»

branje iz datoteke c#

Oddelek: Programiranje
141559 (1288) darkolord
»

[C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene strani

Oddelek: Programiranje
212580 (2190) David1994
»

[c#] string.Trim

Oddelek: Programiranje
51217 (1163) darkolord

Več podobnih tem