Avatar billede aggie Nybegynder
23. april 2001 - 15:10 Der er 20 kommentarer og
1 løsning

Specifik regex ønskes - haster!

Jeg skal bruge en regex der filtrerer

/* her er et vilkårligt antal karakterer og whitespaces, en klassisk kommentar */

fra, men tillader

/*c her er en anden kommentar, der skal blive, pga det lille c i starten og slutningen c*/

og

/*m her er en tredje, den her har et lille m, og det er også ok... m*/

- det vil sige:

alle comments væk, pånær dem der starter med et c|m - husk at der skal være plads til vilkårlige whitespaces etc indeni...

Jeg håber det er tydeligt hvad jeg mener, og at nogen kan skrue den sammen...

jeg har prøvet med:

/\\/\\*(c|m)!.+(c|m)!\\*\\// men den virker ikke?
Avatar billede defrost Nybegynder
23. april 2001 - 15:13 #1
Hvilket sprog benytter du?
Avatar billede aggie Nybegynder
23. april 2001 - 15:18 #2
jeg bruger PHP, med preg funktionerne (perl kompatibel) - men jeg kan også sagtens bruge POSIX extended...
Avatar billede aggie Nybegynder
23. april 2001 - 15:18 #3
jeg bruger PHP, men preg funktionerne (perl kompatibel) - men jeg kan også sagtens bruge POSIX extended...
Avatar billede smshulen.dk Nybegynder
23. april 2001 - 15:19 #4
kig på php.net/manual
Avatar billede aggie Nybegynder
23. april 2001 - 15:23 #5
smshulen.dk:

Jeg er ikke specielt mentalt udfordret, jeg starter altid med at læse manualen, og jeg bruger regex jævnligt, men den her driller, derfor spørger jeg efter en (her citerer jeg spørgsmålets overskrift) Specifik regex fordi jeg ikke har tid til at sidde og bøvle mere med den selv.

I øvrigt er referencen på php.net primært fokuseret på brugen af PHP kommandoerne, ikke på den faktiske udformning af udtrykket..
Avatar billede defrost Nybegynder
23. april 2001 - 15:30 #6
Den er ikke helt nem.

Hvad med preg_replace(\'/\\/\\*(^c|^m).*?\\/\\*/\', \'\');


Avatar billede aggie Nybegynder
23. april 2001 - 15:37 #7
den dur ikke, så vidt jeg kan se af flere grunde:

*? er en ulovlig konstruktion - det kan være du mener .*, men så virker den heller ikke, fordi newlines ikke er indeholdt i . - så jeg prøvede med (.*(\\s)+)+ , som skulle give \"(et vilkårligt antal karakterer og whitespaces (,efterfulgt af 0 eller flere linjeskift)) et vilkårligt antal gange\" - men det dur heller ikke.

Derudover, så betyder den parantes med (^c|^m) \"et c eller et m i starten af strengen\" - og det er det jo ikke, så jeg prøvede [^c|^m], som nok er det du mente, og så giver det mening, men som sagt ikke den del i midten :)
Avatar billede aggie Nybegynder
23. april 2001 - 15:37 #8
den dur ikke, så vidt jeg kan se af flere grunde:

*? er en ulovlig konstruktion - det kan være du mener .*, men så virker den heller ikke, fordi newlines ikke er indeholdt i . - så jeg prøvede med (.*(\\s)+)+ , som skulle give \"(et vilkårligt antal karakterer og whitespaces (,efterfulgt af 0 eller flere linjeskift)) et vilkårligt antal gange\" - men det dur heller ikke.

Derudover, så betyder den parantes med (^c|^m) \"et c eller et m i starten af strengen\" - og det er det jo ikke, så jeg prøvede [^c|^m], som nok er det du mente, og så giver det mening, men som sagt ikke den del i midten :)
Avatar billede aggie Nybegynder
23. april 2001 - 15:37 #9
den dur ikke, så vidt jeg kan se af flere grunde:

*? er en ulovlig konstruktion - det kan være du mener .*, men så virker den heller ikke, fordi newlines ikke er indeholdt i . - så jeg prøvede med (.*(\\s)+)+ , som skulle give \"(et vilkårligt antal karakterer og whitespaces (,efterfulgt af 0 eller flere linjeskift)) et vilkårligt antal gange\" - men det dur heller ikke.

Derudover, så betyder den parantes med (^c|^m) \"et c eller et m i starten af strengen\" - og det er det jo ikke, så jeg prøvede [^c|^m], som nok er det du mente, og så giver det mening, men som sagt ikke den del i midten :)
Avatar billede aggie Nybegynder
23. april 2001 - 15:38 #10
oops
Avatar billede defrost Nybegynder
23. april 2001 - 15:44 #11
Du har næsten ret.

1) .*? er en lovlig konstruktion. Det betyder at * IKKE skal være greedy.
2) newlines kan klares med en s-modifier.
3) Jeps. Det gik lidt stærkt. Korrekt med [ istedet for (.

Prøv med preg_replace(\'/\\/\\*[^c|^m].*?\\/\\*/s\', \'\')
Avatar billede defrost Nybegynder
23. april 2001 - 15:45 #12
Forresten modtog jeg 16 mails med at du havde kommenteret spørgsmålet. :)
Avatar billede aggie Nybegynder
23. april 2001 - 21:13 #13
nope, still no go :(

nu fjerner den det første

/*

men efterlader

m|c

? jeg tror det er i [^c|^m] hunden ligger begravet - vil den godtage alt andet automatisk i den position, eller er det i virkeligheden et tomt sæt?

sorry med de der milliarder af svar før - fik lige parkinsons i fingeren :)
Avatar billede jumper Nybegynder
23. april 2001 - 23:37 #14
Nu roder jeg mest med regexp i javascript, så ret mig hvis jeg tager fejl ;)

/\\/\\*([^cm])?[\\s\\S]*?[^\\1]?\\*\\//

JS bruger \\1 som en backreference til det første capturede match, du skal måske bruge $1 istedet (php stammer jo fra perl).

/Thor
Avatar billede aggie Nybegynder
24. april 2001 - 07:58 #15
nu er vi tæt på :)

Thor, din spiser *alle* C-style kommentarer ( /* */ ), også dem med c|m i starten...

De regex funktioner jeg bruger er Perl-style, ganske rigtigt, men det er regex objektet i JavaScript jo også, så den gik rent igennem :)

men når \\1 er [^cm], bliver [^\\1] så ikke til [^^cm] altså [cm] ?
Avatar billede aggie Nybegynder
24. april 2001 - 08:06 #16
/\\/\\*\\s[\\s\\S]*?\\*\\//

gør tricket, på den måde, at nu er c|m med, men det er
/*lortet virker ikke */
og det er ikke særligt optimalt, men den ignorerer alle de skøre konstruktioner jeg kan finde ud af med c og m :(
Avatar billede jumper Nybegynder
24. april 2001 - 08:08 #17
Hmm, spiser alle, så ændrer vi det til

/\\/\\*([^cm])[\\s\\S]*?[^cm]\\*\\//

Væk med ? omkring [^cm], hvilket dog gør at der mindst skal stå 2 tegn i dine kommentarer (burde ikke være noget problem). Og [^\\1] skulle have været [^cm], det var en tanketorsk *G* ;)

Regexp objektet i js er noget Perl-agtigt, selvom den kun understøtter g og i flagene :/ (samt m i JScript5.5 og JS1.3).

/Thor
Avatar billede jumper Nybegynder
24. april 2001 - 08:10 #18
Baah, vi skal jo ikke gemme nogen match, så:

/\\/\\*[^cm][\\s\\S]*?[^cm]\\*\\//

/Thor
Avatar billede aggie Nybegynder
24. april 2001 - 08:19 #19
hehe, jeg ved det her ser skørt ud, men det virker tilsyneladende, men det er ret grimt :(

/\\/\\*[a-bd-ln-z0-9\\-_\\s]{1}[\\s\\S]*?\\*\\//

burde man ikke kunne bytte

[a-bd-ln-z0-9\\-_\\s]

ud med [\\S\\s^c^m] , eller har jeg misforstået den der ^ i ranges?
Avatar billede aggie Nybegynder
24. april 2001 - 08:21 #20
yupper, der er den!

takker jumper - jeg
Avatar billede aggie Nybegynder
24. april 2001 - 08:22 #21
Jepper! der var den Thor :)

men nu begynder det lille script jeg har, som normalt tager 0.06 sekunder at eksekvere, at tage over 30 sekunder??
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
Kurser inden for grundlæggende programmering

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