FadiY
FadiY

Reputation: 119

Regex doesn't seem to work properly in my code

What I am trying to do is turn, for example "{{John}}" into "John".

First I am parsing from a string:

var parametrar = content.match(/[{{]+[Aa-Åå]+[}}]/g);

Here regex works fine and it parses as it should. I need to parse the "{}" to find stuff in the string.

But then I'm trying to parse out the "{}" from each "parametrar":

for (var i = 0; i < parametrar.length; i++) {
    parametrar = parametrar[i].replace(/[{}]/g, "");
}

When I alert "parametrar" all I get is one "a". I have no idea what I'm doing wrong here, seems it should work.

Upvotes: 0

Views: 68

Answers (4)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627110

You can match the name with braces around and then just use the first capturing group (m[1]):

var re = /\{{2}([a-zA-ZÅå]+)\}{2}/g; 
var str = '{{John}}';
 
if ((m = re.exec(str)) !== null) {
  paramterar = m[1];
  alert(paramterar);
}

If you have a larger string that contains multiple {{NAME}}s, you can use the code I suggested in my comment:

var re = /\{{2}([a-zA-ZÅå]+)\}{2}/g; 
var str = 'My name is {{John}} and {{Vasya}}.';
var arr = [];

while ((m = re.exec(str)) !== null) {
  paramterar = m[1];
  arr.push(m[1]);
}

alert(arr);
alert(str.replace(/([a-zA-ZÅå])\}{2}/g,"$1").replace(/\{{2}(?=[a-zA-ZÅå])/g, ""))
 

I have also fixed the character class to only accept English letters + Å and å (revert if it is not the case, but note that [Aa-Åå] is not matching any upper case Englihs letters from B to Z, and matches characters like §.) Please check the ANSI table to see what range you need.

Upvotes: 0

baybatu
baybatu

Reputation: 71

Try to add greedy matching to maque's answer with using question mark(?).

"{{John}}".replace(/\{\{(.*?)\}\}/g,"$1");

It extracts "John" properly from "{{John}} and Martin}}" input. Otherwise it matches to "John}} and Martin".

Upvotes: 1

onerror
onerror

Reputation: 616

Try this:

var parametrar = content.replace(/\{\{([a-åA-Å]+)\}\}/g, "$1");

This gives you a "purified" string. If you want an array, than you can do this:

var parametrar = content.match(/\{\{[a-åA-Å]+\}\}/g);
for (var i = 0, len = parametrar.length; i < len; i++) {
    parametrar = parametrar[i].replace(/\{\{([a-åA-Å]+)\}\}/g, "$1");
}

Upvotes: 0

maque
maque

Reputation: 686

Just do it like that:

"{{John}}".replace(/\{\{(.*)\}\}/g,"$1");

So you are searching for string that have double '{' (these needs to be escaped), then there is something (.*) then again '}' and your output is first match of the block.

Upvotes: 0

Related Questions