Oprettet søn. d. 19. august 2012 kl. 20:46:16

rapsac
rapsac (13.020 point. Point ude: 120)

Tekstgenkendelse i streng (regex)

Hej

Min bruger bliver præsenteret for et tekstfelt, der indeholder en sætning og eventuelt også hashtags. Disse hashtags skal jeg finde med noget javascript. Det eneste krav jeg har er at disse tags kun må indeholde bogstaver (også specialbogstaver som æ, ø, å, ö osv.) og tal. Eksempler kunne være:

- "Dette er et #hashtag fra #roskilde12" -> hashtag, roskilde12
- "Jeg spiser lige en #pizza!!" -> pizza
- "Hashtags er #d__et fedeste" -> (ingen)

Den løsning jeg har lige nu er nok ikke den smarteste, og den virker ikke med æøå og kun med mellemrum som operator:

analyzeForHashTags: function() {
            var value = this.getEl().getValue();
            var pos = value.indexOf("#");
            var hashtags = [];
            var wlt = Ext.get("wuff-live-tags");
            wlt.update("");
            do {
                var nextWhitespace = value.indexOf(" ", pos);
                if (nextWhitespace == -1) {
                    nextWhitespace = value.length;
                }
                var tagLength = nextWhitespace - pos;
                var tag = value.substr(pos, tagLength);
                if (alphanumeric(tag.substr(1, tag.length-1))) {
                    hashtags.push(tag);
                    var div = document.createElement("div");
                    div.innerHTML = tag;
                    wlt.appendChild(div);
                }
                pos = value.indexOf("#", pos + 1);
            } while (pos > -1);
        }

Kan nogen hjælpe mig lidt?
På forhånd tak!
Caspar

Skrevet søn. d. 19. august 2012 kl. 21:50:53| #1

olebole
olebole (216.878 point)
<ole>

"også specialbogstaver som æ, ø, å, ö osv" >> Du er nødt til at være meget mere specifik. Du må remse alle lovlige - eller alle ulovlige - tegn op. Ellers bliver det svært at lave noget, du kan bruge  =)

/mvh
</bole>

Skrevet søn. d. 19. august 2012 kl. 22:22:08| #2

rapsac
rapsac (13.020 point)
Så lad os sige det sådan her: ALLE bogstaver, tal, - og _

Skrevet søn. d. 19. august 2012 kl. 22:51:04| #3

olebole
olebole (216.878 point)
Don't tell me ... show me. Én af os skal skrive dem, og da det er dig, der skal bruge det, er det dig, der laver arbejdet  =)

Skrevet søn. d. 19. august 2012 kl. 22:57:13| #4

rapsac
rapsac (13.020 point)
Det er der min problemstilling er. Jeg er ikke en haj til regex, og jeg tænker at der må være en smart genvej til "samtlige bogstaver", tal og så tilføje nogle specialtegn manuelt ('-', '_').

Noget i stil med: /\l\n\-_/ hvis \l stod for all letters og \n for all numbers, men det ved jeg ikke.

Skrevet søn. d. 19. august 2012 kl. 23:13:10| #5

olebole
olebole (216.878 point)
Det er der ikke. Du er nødt til selv at definere dem

Skrevet man. d. 20. august 2012 kl. 01:11:36| #6

mbm2007
mbm2007 (10.232 point)
www.magnusbm.dk
Kan du ikke bare matche dine hashtags sådan her:

function analyzeForHashTags(str)
{   
        var hashtagExp = /#[a-z|0-9|æ|ø|å|_]+[0-9]*/gi;
        var hashtag = hashtagExp.exec(str);;
        var hashtags = [];
       
        while (hashtag != null) {
            hashtags.push(hashtag[0]);
            hashtag = hashtagExp.exec(str);                       
        }
        return hashtags;
}


Kig her har jeg er kørende eksempel:
http://galleri58.dk/ (...)

Skrevet man. d. 20. august 2012 kl. 01:12:27| #7

mbm2007
mbm2007 (10.232 point)
www.magnusbm.dk
Hvad laver jeg med min regex? haha

Skrevet man. d. 20. august 2012 kl. 01:27:21| #8

olebole
olebole (216.878 point)
#6: Den mangler da vist oceaner af specialtegn - og så skal du nok lære lidt om tegnsæt  *o)

Skrevet man. d. 20. august 2012 kl. 01:33:22| #9

mbm2007
mbm2007 (10.232 point)
www.magnusbm.dk
Tegnsæt tsh :) er vidst ordnet nu :) meeeeeen olebole han skriver m.h.t post #2:

Så lad os sige det sådan her: ALLE bogstaver, tal, - og _


Min regex ser sådan her ud:
#[a-z|0-9|æ|ø|å|_|-]+

Dvs. den tjekker for ALLE bogstaver inkl. æøå, OG den tjekker for - og _ han spurgte da ikke om at den skulle understøtte oceaner af specialtegn?

Skrevet man. d. 20. august 2012 kl. 01:36:07| #10

mbm2007
mbm2007 (10.232 point)
www.magnusbm.dk
Han kan så selv i regex'en som han selv siger tilføje nogle specialtegn manuelt :)

Skrevet man. d. 20. august 2012 kl. 01:46:58| #11

olebole
olebole (216.878 point)
Aha - og hvad betyder mon så: "(også specialbogstaver som æ, ø, å, ö osv.)"?

Derudover er din løsning ikke ligefrem 'ortodoks'  =)

var aRes = [], inx = 0;
[STRING].replace(/#([a-z0-9æøå_]+)/gi, function(a,b){aRes[inx++]=b});

alert(aRes.join("\n"));

- men alle de manglende specialtegn skal stadig listes

Skrevet man. d. 20. august 2012 kl. 01:55:49| #12

mbm2007
mbm2007 (10.232 point)
www.magnusbm.dk
Nice måde at gøre det på, vidste ikke man kunne benytte en funktion som parameter :) er det en standard?

Skrevet man. d. 20. august 2012 kl. 02:11:39| #13

olebole
olebole (216.878 point)
Hvis du mener, om det er almindeligt at gøre, så er svaret: Ja  =)

Skrevet man. d. 20. august 2012 kl. 02:35:10| #14

mbm2007
mbm2007 (10.232 point)
www.magnusbm.dk
Tror han har nok kode nu til selv at løse sit problem :) igang med at definere :)

Skrevet man. d. 20. august 2012 kl. 19:21:42| #15

mireigi
mireigi (20.272 point)
Matcher alfanumeriske tegn med hashtag foran og specialtegn eller mellemrum bagefter.
(?<=#)[\d\w]+(?=[\W\s]+)


Skal der tages højde for specialtegn der er gyldige i ordet, skal disse placeres efter \d\w. Husk at escape (\ foran) regex tegn:
?  +  .  *  \  (  )  [  ]  {  }

Skrevet man. d. 20. august 2012 kl. 20:57:41| #16

olebole
olebole (216.878 point)
#15: Ikke, at jeg har testet koden - men jeg tvivler på, at du selv har  =)

Skrevet man. d. 20. august 2012 kl. 23:00:49| #17

mireigi
mireigi (20.272 point)
Skyldig som anklaget. Den er bare hurtigt flikket sammen. Er ikke engang sikker på om man kan lave bag-/forud opslag i JS.

Skrevet man. d. 20. august 2012 kl. 23:14:10| #18

olebole
olebole (216.878 point)
Det kan man godt, men jeg tror ikke, du helt har forstået opgaven: Et hashmark, efterfulgt af tal, underscore eller bogstaver - herunder alle alfabetiske specialtegn. Right boundary er et mellemrum  =)

Skrevet tir. d. 21. august 2012 kl. 00:23:52| #19

mireigi
mireigi (20.272 point)
Jeg tror ikke der skal være underscore i, ikke ifølge eksempel 3 han har givet.

Men for en der tager alle tegn mellem hashmark og mellemrum, ser den vistnok således ud:
(?<=#).[^\s]+(?=\s)

Skrevet tir. d. 21. august 2012 kl. 00:43:44| #20

olebole
olebole (216.878 point)
Så må du jo prøve at læse teksten. Det står højt og larmende, at underscore skal accepteres - og faktisk også bindestreg. Bindestregen er dog ligetil at indsætte i #11.

Jeg må stadig anbefale at du tester din kode. Det er ikke en anvendelig JS-syntaks. Dit '<' er en fejl. Det skal fjernes for at virke.

Derudover er der ingen grund til at suge vitaminer ud af maskinen med helt overflødige og grådige lookahead assertions.

Men hvorfor er alt andet end white-space nu pludselig tilladt i #19. Det virker ikke, som om du har helt styr på RegExp's virkemåde  =)

Skrevet tir. d. 21. august 2012 kl. 11:51:42| #21

mireigi
mireigi (20.272 point)
(?<=#) er look-behind for hashmark så det ikke kommer med ud i resultatet.

.[^\s]+ finder alle tegn, uanset hvad det er for tegn, bare ikke et whitespace.

(?=\s) finder første whitespace og virker derfor som stopklods for udtrykket.

Det er muligt at .[^\s]+ ikke virker helt 100%, men så er vi ude i noget i stil med dette:

[\d\w\W][^\s]+ som finder alle tal, bogstaver og ikke-bogstaver (er i tvivl om hvorvidt \W inkluderer \s)

Skrevet tir. d. 21. august 2012 kl. 15:07:04| #22

olebole
olebole (216.878 point)
Jeg har ingen problemer med at læse, skrive eller forstå en RegExp. Jeg forstår bare ikke, du vælger den mest ressourcekrævende løsning - og specielt ikke, når den ikke opfylder kravene  =)

I JS er (?<=#) ikke en lookbehind, men en syntaksfejl. 'Ægte' lookbehinds er ikke understøttet i JS - kun lookaheads. Lookbehinds er man nødt til at 'hacke' sig til. Den tilsvarende positive lookahead i JS er til gengæld helt 'Pearlish': (?=#)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Shadowbox.js viser ikke Next/previous picture..

Oprettet den 19. juni 2013 kl. 21.23
almex giver 30 point for svar | Giv et svar »

Genstart en jQuery funktion før den ender

Oprettet den 19. juni 2013 kl. 19.22
cubie giver 15 point for svar | Giv et svar »

Opdeling af datofelt

Oprettet den 17. juni 2013 kl. 22.07
quarkb giver 150 point for svar | Giv et svar »







IT Kurser
Samarbejdspartnere

Udgiver · © 2013 Computerworld A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger