Avatar billede Slettet bruger
19. august 2012 - 20:46 Der er 22 kommentarer

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
Avatar billede olebole Juniormester
19. august 2012 - 21:50 #1
<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>
Avatar billede Slettet bruger
19. august 2012 - 22:22 #2
Så lad os sige det sådan her: ALLE bogstaver, tal, - og _
Avatar billede olebole Juniormester
19. august 2012 - 22:51 #3
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  =)
Avatar billede Slettet bruger
19. august 2012 - 22:57 #4
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.
Avatar billede olebole Juniormester
19. august 2012 - 23:13 #5
Det er der ikke. Du er nødt til selv at definere dem
Avatar billede mbm2016 Nybegynder
20. august 2012 - 01:11 #6
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/hashtags.html
Avatar billede mbm2016 Nybegynder
20. august 2012 - 01:12 #7
Hvad laver jeg med min regex? haha
Avatar billede olebole Juniormester
20. august 2012 - 01:27 #8
#6: Den mangler da vist oceaner af specialtegn - og så skal du nok lære lidt om tegnsæt  *o)
Avatar billede mbm2016 Nybegynder
20. august 2012 - 01:33 #9
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?
Avatar billede mbm2016 Nybegynder
20. august 2012 - 01:36 #10
Han kan så selv i regex'en som han selv siger tilføje nogle specialtegn manuelt :)
Avatar billede olebole Juniormester
20. august 2012 - 01:46 #11
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
Avatar billede mbm2016 Nybegynder
20. august 2012 - 01:55 #12
Nice måde at gøre det på, vidste ikke man kunne benytte en funktion som parameter :) er det en standard?
Avatar billede olebole Juniormester
20. august 2012 - 02:11 #13
Hvis du mener, om det er almindeligt at gøre, så er svaret: Ja  =)
Avatar billede mbm2016 Nybegynder
20. august 2012 - 02:35 #14
Tror han har nok kode nu til selv at løse sit problem :) igang med at definere :)
Avatar billede mireigi Novice
20. august 2012 - 19:21 #15
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:
?  +  .  *  \  (  )  [  ]  {  }
Avatar billede olebole Juniormester
20. august 2012 - 20:57 #16
#15: Ikke, at jeg har testet koden - men jeg tvivler på, at du selv har  =)
Avatar billede mireigi Novice
20. august 2012 - 23:00 #17
Skyldig som anklaget. Den er bare hurtigt flikket sammen. Er ikke engang sikker på om man kan lave bag-/forud opslag i JS.
Avatar billede olebole Juniormester
20. august 2012 - 23:14 #18
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  =)
Avatar billede mireigi Novice
21. august 2012 - 00:23 #19
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)
Avatar billede olebole Juniormester
21. august 2012 - 00:43 #20
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  =)
Avatar billede mireigi Novice
21. august 2012 - 11:51 #21
(?<=#) 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)
Avatar billede olebole Juniormester
21. august 2012 - 15:07 #22
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': (?=#)
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

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