使用一个JavaScript正则表达式捕获四个数字

时间:2015-09-08 14:52:41

标签: javascript regex

我想捕获只有一个正则表达式的四个组。

我有这段文字:

validate_unique/3

我希望得到钥匙后面的数字:

unique_constraint/3

我只能使用一个正则表达式,所以我尝试了这种方法:

PAY VALUES TO SUM - WITHOU NOTHING: 0.00 (IGNORE THE REST)
PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 (IGNORE THE REST)
PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 (IGNORE THE REST)
PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 (IGNORE THE REST)

结果是PAY VALUES TO SUM - WITHOU NOTHING: PAY VALUES TO SUM - ADD. 50 YEARS: PAY VALUES TO SUM - ADD. 70 YEARS: PAY VALUES TO SUM - ADD. 80 YEARS:

这是我尝试使用的正则表达式:

var text = 'PAY VALUES TO SUM - WITHOU NOTHING: 0.00 13º WORD WORD: 0.00' +
text += 'PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 WORD WORD WORD WORD WORD WORD WORD: 0.00';

var reg = new RegExp(SOME REGEX);
var match = reg.exec(text);

console.log(match[1], match[2], match[3], match[4]);

我的想法是在我可以传入的单词或数字之后捕获组。

但显然这是无效的。我怎样才能实现目标?

有时数字会发生变化。它们并非总是0.00 0.00 .00 .00

我需要明确传递单词的名称和捕获组。由于文字很大,我只在上面展示了部分内容。

我有另外一个可以做我正在尝试的正则表达式,但是有另一个文本:

new RegExp('PAY VALUES TO SUM - WITHOU NOTHING:' + '\\b.*?(?:\\d\\S*\\s+){1}(\\d\\S*)(?:\\s?\\d\\S*\\s+){14}(\\d\\S*)(?:\\s?\\d\\S*\\s+){14}(\\d\\S*)(?:\\s?\\d\\S*\\s+){29}(\\d\\S*)(?:\\s?\\d\\S*\\s+){41}(\\d\\S*)');

在这种情况下,我传递了“PREV SOC 01”字样。和两个捕获组,一个捕获0.00,另一个捕获var text = 'PREV SOC 01 672 1.653.806,08 18.512,98 1.667.621,57 2.647,38 07 23 12.965,11 0,00 12.965,11 0,00' var reg = new RegExp('PREV SOC 01' + '\\b.*?(?:\\d\\S*\\s+){4}(\\d\\S*)(?:\\s?\\d\\S*\\s+){5}(\\d\\S*)', 'i'); var match = reg.exec(text); console.log(match[1]); console.log(match[2]);

我在其他文字中也需要相同的内容:

1.667.621,57

我想传递0,00并在数字和数字后选择我想要的内容。

5 个答案:

答案 0 :(得分:1)

您只需要捕获0.00之类的双号,这就是您需要的正则表达式(\d.\d{2})

var text = 'PAY VALUES TO SUM - WITHOUT NOTHING: 0.13 13º WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 50 YEARS: 3.85 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 70 YEARS: 9.02 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 80 YEARS: 5.21 WORD WORD WORD WORD WORD WORD WORD: 0.00';

var re = /(\d.\d{2})/g;

var m;
 
while ((m = re.exec(text)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    document.write(m[0]+" ");
}

这是 regex101 DEMO

注意: 我仅将document.write()用于测试,避免使用它。

编辑:

这是第二次尝试得到你需要的新的正则表达式(PAY VALUES TO SUM - (?:WITHOU NOTHING|ADD. \d{2} YEARS): (\d.\d{2})),我希望它是你正在寻找的:

var text = 'PAY VALUES TO SUM - WITHOU NOTHING: 0.13 13º WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 50 YEARS: 3.85 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 70 YEARS: 9.02 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 80 YEARS: 5.21 WORD WORD WORD WORD WORD WORD WORD: 0.00';

var re = /(PAY VALUES TO SUM - (?:WITHOU NOTHING|ADD. \d{2} YEARS): (\d.\d{2}))/g;

var m;

while ((m = re.exec(text)) !== null) {
  if (m.index === re.lastIndex) {
    re.lastIndex++;
  }
  document.write(m[0] + "<br>");
}

答案 1 :(得分:1)

以下是我对您的问题的解释:

    var a = 1;

    function hello() {
      var a = 3;
      (function() {
        alert(a);
      }());
    }

    hello(); //alerts 3

答案 2 :(得分:0)

如果我理解正确,您只需要在每行:之后的每个xx.xx号码的第一次出现,因为数字也可能在第一次出现后发生。

如果是这种情况,那么这是你的正则表达式:

/^.*?:\s*([\d\.]+).*/gm

这是一个演示:https://regex101.com/r/gT9tJ0/1

答案 3 :(得分:0)

首先将您的密钥放入数组:

var keys = [
  'PAY VALUES TO SUM - WITHOU NOTHING:',
  'PAY VALUES TO SUM - ADD. 50 YEARS:',
  'PAY VALUES TO SUM - ADD. 70 YEARS:',
  'PAY VALUES TO SUM - ADD. 80 YEARS:'
];

现在编译一个正则表达式,在每个键后面查找一个数字。您可以使用[0-9.]+来匹配课程[0-9.]中一个或多个字符的序列,其中包含数字09.(期)。这足以匹配看起来像0.00314.159的数字。

这是一个正则表达式,使用[0-9.]+在每个键后提取一个数字:

var regex = RegExp(keys[0] + '\\s+([0-9.]+).*?' +
                   keys[1] + '\\s+([0-9.]+).*?' +
                   keys[2] + '\\s+([0-9.]+).*?' +
                   keys[3] + '\\s+([0-9.]+).*?', 'gi');

请注意\\s+匹配每个键后的一个或多个空格。如果要匹配零个或多个空格,可以将其更改为\\s*

我们正在使用.*?来匹配下一个键之前最短的字符序列。 'gi'标志使正则表达式全局匹配(g),而不考虑大小写(i)。

在执行正则表达式之前,最好用可见空格替换所有不可见的空格。这是因为.*与行尾字符不匹配。

text = text.replace(/\s/g, ' ');

下面的代码段演示了此方法,其中包含您在问题中提供的示例文本和密钥。

&#13;
&#13;
function print(s) {
  document.write(s + '<br />');
}

var keys = [
  'PAY VALUES TO SUM - WITHOU NOTHING:',
  'PAY VALUES TO SUM - ADD. 50 YEARS:',
  'PAY VALUES TO SUM - ADD. 70 YEARS:',
  'PAY VALUES TO SUM - ADD. 80 YEARS:'
];

// Compile a regular expression that looks for a number after each key.
var regex = RegExp(keys[0] + '\\s+([0-9.]+).*?' +
                   keys[1] + '\\s+([0-9.]+).*?' +
                   keys[2] + '\\s+([0-9.]+).*?' +
                   keys[3] + '\\s+([0-9.]+).*?', 'gi');

var text = document.getElementById('content').innerHTML;

// Replace newlines and other invisible whitespace with visible spaces.
text = text.replace(/\s/g, ' ');

// Find and display all matches.
var count = 0;
while (true) {
  var match = regex.exec(text);
  if (match === null) {
    break;
  }
  ++count;
  print('match ' + count + ': ' +
        [match[1], match[2], match[3], match[4]].join(' '));
}
&#13;
body {
  font-family: sans-serif;
}
#content {
  display: none;
}
&#13;
<div id="content">
PAY VALUES TO SUM - WITHOU NOTHING: 0.00 13º WORD WORD: 0.00
PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 WORD WORD WORD: 0.00
PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 WORD WORD WORD: 0.00
PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 WORD WORD WORD WORD WORD WORD WORD: 0.00
</div>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

试试这个:你可以使用这个简短的正则表达式:/PAY\s+VALUES\s+TO\s+SUM\s+[^:]+:\s*([\d.]+)/gmi

<强> Regex demo

&#13;
&#13;
    var re = /PAY\s+VALUES\s+TO\s+SUM\s+[^:]+:\s*([\d.]+)/gmi; 
    var str = 'var text = \'PAY VALUES TO SUM - WITHOU NOTHING: 0.00 13º WORD WORD: 0.00\' +\ntext += \'PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 WORD WORD WORD: 0.00\';\ntext += \'PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 WORD WORD WORD: 0.00\';\ntext += \'PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 WORD WORD WORD WORD WORD WORD WORD: 0.00\';\n';
    var m;
     
    while ((m = re.exec(str)) !== null) {
        if (m.index === re.lastIndex) {
            re.lastIndex++;
        }
        // View your result using the m-variable.
        document.write(m[1]+ ' ');
    }
&#13;
&#13;
&#13;