Avatar billede stalle Nybegynder
09. december 2005 - 11:18 Der er 13 kommentarer og
3 løsninger

Finde bestemte dele i tekst streng med Regex ?

Jeg har nogle filer, hvor jeg skal kigge efter nogle bestemte ting.
Jeg kigger i filerne linie for linie.

Det jeg skal finde er fx:
B000 til B199
I000 til I199
D000 til D199
R000 til R199
P000 til P199
BP000 til BP199
EX000 til EX199

Altså skal jeg søge på en sammensætning af 4-5 tegn, hvor det første tegn er forudbestemt.

Tænker det er noget man kan lave med regex, men er totalt lost hvad det angår.

Håber nogen kan hjælpe.
Avatar billede Slettet bruger
09. december 2005 - 18:24 #1
Skal de ting, du leder efter stå i starten af linien, eller må de være hvor som helst?
Avatar billede stalle Nybegynder
09. december 2005 - 21:10 #2
De kan forekomme tilfældige steder i linien
Avatar billede arne_v Ekspert
09. december 2005 - 21:17 #3
"[BIDRP][0-1]\d\d" vil matche alle 1+3

"([BIDRP][0-1]\d\d)|(BP[0-1]\d\d)|(EX[0-1]\d\d)" måske
Avatar billede Slettet bruger
09. december 2005 - 21:46 #4
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
Avatar billede stalle Nybegynder
09. december 2005 - 22:30 #5
Alle de ovennævnte kan forekomme hvor som helst. Med eller uden noget før eller efter.
Avatar billede 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?
Avatar billede 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.

(?<from>[A-Z]{1,2}\d{3})\s+til\s+(?<to>[A-Z]{1,2}\d{3})

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.
Avatar billede stalle Nybegynder
10. december 2005 - 12:28 #8
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
Avatar billede Slettet bruger
10. december 2005 - 13:02 #9
Så skal du rigtigt nok bare bruge første del

[A-Z]{1,2}\d{3}
Avatar billede stalle Nybegynder
10. december 2005 - 16:45 #10
okay - er det alligevel "så simpelt" - jeg vil prøve det...
Avatar billede 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.
Avatar billede stalle Nybegynder
10. december 2005 - 21:23 #12
RIGITG nice.
Ud fra din forklaring sandbox, kastede jeg mig over dit forslag først.

Må sige at jeg er rigitg godt tilfreds, så det er faktisk dig der burde have pointene.

Ved ikke om det er sådan at jeg ved samme lejlighed kan gøre sådan at jeg trækker den kombination ud, som ovenstående har hittet på.?
Avatar billede arne_v Ekspert
10. december 2005 - 21:40 #13
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
Avatar billede 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.
Avatar billede stalle Nybegynder
11. december 2005 - 01:11 #15
RIGTIG fed alle sammen.

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.

Mange tak skal i have gutter...

Hvad med dig Arne...point ?
Avatar billede arne_v Ekspert
11. december 2005 - 02:08 #16
tjo
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester