简体   繁体   English

JavaScript中奇怪的RegExp行为

[英]Strange RegExp behavior in JavaScript

I need to capture every %{string} sequience in a string. 我需要捕获%{string}每个%{string}序列。 I am created a RegExp: /[^%]*(%{[^}]+})?/g , which works correctly on string Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer} on regex101.com ( https://regex101.com/r/aB2xL5/1 ), but incorrect in JS: var a='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}'.match(/[^%]*(%{[^}]+})?/g);
console.log(a); //['Lorem %{ipsum}', ' dolor %{sit}', ' amet adipiscing aenean %{consectetuer}', '']
我创建了一个RegExp: /[^%]*(%{[^}]+})?/g ,它可以在Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}上的字符串Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer} consectetuer Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}上正常工作.com( https://regex101.com/r/aB2xL5/1 ),但在JS中不正确: var a='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}'.match(/[^%]*(%{[^}]+})?/g);
console.log(a); //['Lorem %{ipsum}', ' dolor %{sit}', ' amet adipiscing aenean %{consectetuer}', '']
var a='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}'.match(/[^%]*(%{[^}]+})?/g);
console.log(a); //['Lorem %{ipsum}', ' dolor %{sit}', ' amet adipiscing aenean %{consectetuer}', '']
var a='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}'.match(/[^%]*(%{[^}]+})?/g);
console.log(a); //['Lorem %{ipsum}', ' dolor %{sit}', ' amet adipiscing aenean %{consectetuer}', '']
What i am doing wrong?
var a='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}'.match(/[^%]*(%{[^}]+})?/g);
console.log(a); //['Lorem %{ipsum}', ' dolor %{sit}', ' amet adipiscing aenean %{consectetuer}', '']
我在做什么错?

What i need: Input string: 'abc %{def} ghi %{jkl}' Output array: ['%{def}','%{jkl}'] 我需要什么: Input string: 'abc %{def} ghi %{jkl}' Output array: ['%{def}','%{jkl}']

As said in the comments, don't access the whole match which, even on regex101, contains more than you need, but rather access the first group of the match. 如评论中所述,不要访问整个匹配项,即使在regex101上,它也包含超出您需要的内容,而是访问匹配项的第一组。

To do so, use Regex.prototype.exec instead of String.prototype.match : 为此,请使用Regex.prototype.exec而不是String.prototype.match

var regex=/[^%]*(%{[^}]+})?/g;
var data='Lorem %{ipsum} dolor %{sit} amet adipiscing aenean %{consectetuer}';
var result=[];
var match;
while (match = regex.exec(data)) {
  result.push(match[1]);  // match the first group of the result
}

Edit : I just saw Thomas' comment, which is much better than this solution. 编辑:我刚刚看到托马斯的评论,这比这个解决方案要好得多。 I'll leave it here because it does indeed solve your problem and explains how to capture groups, but you should use his regex. 我将其保留在此处,因为它确实可以解决您的问题并说明了如何捕获组,但是您应该使用他的正则表达式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM