如何使用正则表达式将String.match()与$ {SOME_TEXT}区分开来

时间:2014-01-22 20:00:43

标签: javascript regex string string-matching

我需要这个字符串:

var x = 'Hi ${name}! How are you? ${name}, you are old! ${name} share with ${other} how do u ${feel}!'

我需要知道使用正则表达式存在多少不同的$ {ANY_THING}。在上面的示例中,我预计3:$ {name},$ {other},$ {feel}

我正在尝试:

x.match(\${([a-zA-Z]))

但输出错误:(

谢谢!

3 个答案:

答案 0 :(得分:5)

  

我需要知道使用正则表达式存在多少不同的$ {ANY_THING}

x.match(/\$\{[^\}]+\}/g)
 .sort()
 .filter(function(element, index, array) {
     return index == array.indexOf(element);
 }) // this .filter() filters out the duplicates (since JS lacks of built in
    // unique filtering functions
 .length;

上面的代码会返回3,因为x字符串中有多少个不同的项目。

JSFiddle:http://jsfiddle.net/cae6P/

PS:仅使用正则表达式是不可能的。您需要使用.filter()解决方案或其他类似的

过滤重复项

答案 1 :(得分:1)

我通过 farn 用户在#regex IRC频道找到此解决方案:

x.match(/\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g);

输出:

['${name}',
 '${other}',
 '${feel}']

x.match(/\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g).length;

输出:

3

:)

答案 2 :(得分:0)

要匹配您想要的语法,您需要:

x.match(/\$\{([a-zA-Z]+)\}/)