Sammaye
Sammaye

Reputation: 43884

JavaScript Regex Help!

I am trying to match a @ tags within this string:

 @sam @gt @channel:sam dfgfdh sam@sam

Now in regex testers this works @[\S]+ (with settings on JS testing) to pick out all strings starting with @ so in them I get:

@sam @gt @channel:sam @sam

But then in browsers using this code:

function detect_extractStatusUsers(status){
var e = new RegExp('@[\S]+', 'i');
m = e.exec(status);
var s= "";

if (m != null) {
    for (i = 0; i < m.length; i++) {
        s = s + m[i] + "\n";
    }
    alert(s);
}

return true;
}

I can only get one single match of @ (if I'm lucky, normally no match).

I must be missing something here and my eyes have just been looking at this for too long to see what it is.

Can anyone see what's wrong in this function?

Thanks,

Upvotes: 3

Views: 99

Answers (2)

Martijn
Martijn

Reputation: 13622

You need to call exec repeatedly, until it returns null. Each time it will return a match object, containing all the captures for that match.

I've taken the liberty of rewriting your function the way I would have written it:

function detect_extractStatusUsers(status){
    var rx = /(@[\S]+)/gi,
        match,
        tags = [];
    while (match = e.exec(status)) {
        tags.push(match[1]);
    }
    if (tags.length > 0) {
        alert(tags.join('\n'));
    }
}

Upvotes: 1

mVChr
mVChr

Reputation: 50177

You need to:

  • use the global search g setting
  • escape your \
  • use match instead of exec

    var e = new RegExp('@[\\S]+', 'gi');

    m = status.match(e);

Upvotes: 6

Related Questions