Ved du noget om hvilke(t) tegn, der kommer lige før din søgestreng? Det kan nemlig godt være lidt problematisk, at en af dine gyldige søgestrenge samtidig er en bestanddel af en af de andre. Tænker her på at P000 er en del af BP000
Alle de ovennævnte kan forekomme hvor som helst. Med eller uden noget før eller efter.
Synes godt om
Slettet bruger
09. december 2005 - 23:39#6
Hvordan skal man så kunne kende forskel på om der står P000 og det tilfældigvis står lige efter et B, eller om det skal være BP000?
Synes godt om
Slettet bruger
10. december 2005 - 08:21#7
Denne finder ovenstående typer af "sætninger", som laver named-matchgroups således at det første står i from og det andet står i to. Du kan bare droppe ?<from> og ?<to>, hvis du bare vil tilgå per index alligevel.
Læs: Matcher A-Z (kun store bogstaver) 1 eller 2 gange (husk den matcher så meget den kan, derfor 2 hvis der er 2) match 3 numeriske. Imellem dette kan der være et eller flere mellemrum, der skal stå til og der kan igen være et eller flere mellemrum. Sidste del svare til den første.
okay... kryptos - som jeg ser det, så er det kun den første del jeg skal bruge. fx. B000 til B199 er blot for at sige at der i min streng kan stå en af disse, og derimellem. Altså.. Streng 1: CLEAR B199 1 Streng 2: SET B070 EXPRESS B003 + 100
i steng 1 skal den så finde B199 og i streng 2 skal den finde B070 OG B003
okay - er det alligevel "så simpelt" - jeg vil prøve det...
Synes godt om
Slettet bruger
10. december 2005 - 18:36#11
Og muligvis kan du bruge denne:
\b(B|I|D|R|P|BP|EX)(0|1)\d{2}\b
Den er lidt mere præcis og fanger kun dine ønskede strenge, hvis de står "for sig selv" - altså i starten eller slutningen af en linie, eller adskilt med mellemrum eller lignende fra de omgivende ord.
\b betyder en "ordgrænse", altså et sted, hvor et ord starter eller stopper. | betyder eller og parenteserne bruges til at gruppere, så (0|1) betyder et nul eller et ettal
Forskellen på (0|1)\d{2} i min og \d{3} i kryptos' er altså at min kun godtager 000-199, hvor den anden også godtager 200-999.
Tilsvarende med bogstaverne, hvor min kun finder de bestemte bogstavkombinationer, du nævnte.
Grunden til at jeg først stillede spørgsmål, hvar at jeg ville finde ud af, hvordan dine søgestrenge adskilte sig fra den omgivende tekst. Det kan nemlig tit være nødvendigt at vide, for at undgå at fange ting, man ikke er interesseret i. For eksempel ville kryptos' forslag også fange "KS320" hvis din tekst indeholder "BOKS320341", for der er jo to bogstaver fulgt af tre tal.
Det største problem ved at skrive en regex er oftest at finde ud af nøjagtigt hvor præcis man skal være, for hvis man ikke er præcis nok, får man hits, hvor man ikke ønskede det - og nogle gange skal man være mere præcis end man troede.
using System; using System.Text.RegularExpressions;
class MainClass { public static void Main(string[] args) { test("CLEAR B199 1"); test("SET B070 EXPRESS B003 + 100"); } private static void test(string s) { MatchCollection res = Regex.Matches(s,@"\b(B|I|D|R|P|BP|EX)(0|1)\d{2}\b"); for(int i = 0; i < res.Count; i++) { Console.WriteLine(res[i].Groups[0]); } } }
udskriver
B199 B070 B003
Synes godt om
Slettet bruger
10. december 2005 - 21:51#14
Godt arne_v var hurtig der, for jeg har ikke rigtig benyttet regex fra C# endnu, så jeg skal lede efter alt det objekt-hurlumhej, man skal skrive for at kunne bruge dem. Selv om selve regexen er 99% det samme som i Perl eller PHP, er det nemlig ikke helt samme måde, man bruger til at trække tingene ud. (Jeg er stadig begynder i C#)
Må jeg foreslå, at pointene deles mellem os? Det var nemlig først efter at kryptos havde fået dig til at afsløre et eksempel på den egentlige tekst, der skulle søges i 10/12-2005 12:28:14 at det reelt var muligt at komme med forslag.
Var faktisk lidt interesseret i om regex var så godt som ens, for både PHP og C#. Har selv gjort en "del" i PHP, dog uden og arbejde en masse med regex.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.