【问题标题】:How to String.match() distinct it ${SOME_TEXT} using Regex如何使用正则表达式区分 String.match() ${SOME_TEXT}
【发布时间】:2014-02-13 02:11:44
【问题描述】:

我需要这个字符串:

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

我需要知道使用 Regex 有多少不同的 ${ANY_THING} 存在。在上面的例子中,我期望 3: ${name}, ${other}, ${feel}

我正在尝试:

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

但是输出错误:(

谢谢!

【问题讨论】:

  • 第一个应该是 ${name} 而不是 {$name}?
  • 是的,对不起。我会解决的。
  • 这是一个很好的问题,但我觉得标题可能更相关 - 事实上,对于有类似问题的人来说,它不太可能出现在任何搜索结果中。
  • 已编辑:如何 String.match() 使用正则表达式区分 ${SOME_TEXT}。现在好点了? :) 我愿意接受建议。

标签: javascript regex string string-matching


【解决方案1】:

我在 farn 用户的#regex IRC 频道上找到了这个解决方案:

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

输出:

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

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

输出:

3

:)

【讨论】:

  • x.match(/\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g).replace(); 输出TypeError: Object [object Array] has no method 'replace'
  • @zerkms 你如何使用它可能有问题。为了证明完全没问题,看他的链接:regex101.com/r/eW3jY4Cheers!
  • 不是我在使用它 - 我只是按照您在答案中提供的代码原样使用
  • 您的代码有问题。看:jsbin.com/luheq/1/edit?js,console
  • zerkms,对不起。我猜你是说问题出在正则表达式上,而不是 replace() 上。我修好后。再次抱歉。你不需要表现得好像人们总是在和你开玩笑或开玩笑。人会犯错,你可能太完美了。
【解决方案2】:

我需要知道使用 Regex 有多少不同的 ${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() 解决方案或其他类似方法过滤重复项

【讨论】:

  • 是的,它解决了问题,但我在节点控制台上对其进行了测试 :) 并且看起来如果只使用正则表达式,它会匹配 ${name} 3x 次: > x.match(/\$ \{[^\}]+\}/g); ['${name}', '${name}', '${name}', '${other}', '${feel}' ]
  • @user3207109:是的,它匹配 name 3 次,因为有 3 个 name 元素。那么?
  • 只使用正则表达式和 x.match() 可能只匹配 ${name}(1 次)、${other}、${feel} 而不是 ${name}、${name} , ${name} (3 次), ${other}, ${feel}?
  • @CodeWarrior:我几乎不怀疑
  • 看看我发现了什么:x.match(/\$\{([^\}]+)\}(?![\S\s]*\$\{\1\} )/G);帅哥!
【解决方案3】:

要匹配你想要的语法,你需要这个:

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

【讨论】:

  • 如果您需要整个 ${name} 而不是 name,只需执行 x.match(/(\$\{[a-zA-Z]+\})/)
  • 谢谢,但真正正确回答问题的问题来自 zerkms :) 干杯!
猜你喜欢
  • 2011-10-31
  • 2023-03-07
  • 1970-01-01
  • 2018-09-15
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多