【问题标题】:Capture four numbers with one JavaScript regular expression用一个 JavaScript 正则表达式捕获四个数字
【发布时间】:2015-09-08 14:52:41
【问题描述】:

我想用一个正则表达式捕获四个组。

我有这段文字:

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*)');

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

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

有时数字会发生变化。他们并不总是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]);

在这种情况下,我将传递单词“PREV SOC 01”和两个捕获组,一个捕获1.667.621,57,另一个捕获0,00

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

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';

我想通过'PAY VALUES TO SUM - WITHOUT NOTHING:' 并在数字和数字之后选择我想要的。

【问题讨论】:

  • 我推荐使用regex101.com 作为尝试正则表达式的地方,
  • 谢谢@Ginden,我已经知道了,我已经尝试学习很多正则表达式,但是逻辑非常困难

标签: javascript regex


【解决方案1】:

这是我对您的问题的解释:

var text = ''
+ 'PAY VALUES TO SUM - WITHOU NOTHING: 0.00 (IGNORE THE REST)\n'
+ 'PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 (IGNORE THE REST)\n'
+ 'PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 (IGNORE THE REST)\n'
+ 'PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 (IGNORE THE REST)';

var re = /^PAY VALUES TO SUM - (?:WITHOU NOTHING|ADD\. \d+ YEARS): ([\d.]+).*$/gm;
document.write('<pre>' + text.replace(re, '$1').replace(/\n/g, ' ') + '</pre>');

// a little less specific

var re = /^PAY VALUES TO SUM - [^:]+: ([\d.]+).*$/gm;
document.write('<pre>' + text.replace(re, '$1').replace(/\n/g, ' ') + '</pre>');

【讨论】:

  • 伙计们,看看我有jsfiddle.net/5x9wLuja/1的这个正则表达式我在PREV SOCIAL 01之后推送两个值,我可以说'我想要5个表达式之后的值'..我需要这样的东西
  • @AmandaFerrari 这个小提琴没有更多地说明你想要什么。尝试更好地描述您的需求。
  • 好的,让我来,等一下,我会更新我的答案。
【解决方案2】:

您只需要捕获像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>");
}

【讨论】:

  • 问题是这是一个动态值,有时不是 0.00 @chsdk
  • 我更新了我的问题,遗漏了一些事实,对此感到抱歉。我需要明确传递我需要的单词,因为文本很大。
  • @AmandaFerrari 我更新了我的答案,你可以看到它捕获了不同的数字。
  • 我需要通过 PAY VALUES 来求和 - 没有任何东西:和四个捕获组,可能吗? @chsdk
  • @AmandaFerrari 请看看我的编辑,我希望它是你要找的,我使用了这个正则表达式:(PAY VALUES TO SUM - (?:WITHOU NOTHING|ADD. \d{2} YEARS): (\d.\d{2}))
【解决方案3】:

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

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, ' ');

下面的 sn-p 使用您在问题中提供的示例文本和键演示了这种方法。

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(' '));
}
body {
  font-family: sans-serif;
}
#content {
  display: none;
}
<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>

【讨论】:

  • 嘿,迈克尔,你又来了,哈哈。这个不错,不过需要问问不能这样:jsfiddle.net/5x9wLuja/1 ??
  • 我不确定你的意思。你想改变什么?我分配text的值的方式?
  • 不是这样的。只需使用一个正则表达式,然后传递 4 个捕获组,就像在小提琴中一样。如果不可能,那也没关系。
  • Michael,也许我少 50 分可以帮助我完成最后一个需要完成的正则表达式? -> stackoverflow.com/questions/32465952/…
  • 我今天输了15分,因为你不接受这个答案。是答案有问题,还是意外?
【解决方案4】:

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

如果是这样,那么这就是你的正则表达式:

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

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

【讨论】:

  • 查看我的更新,我需要明确传递名称和捕获组,文本很大,我只是复制感兴趣的一方
  • 抱歉,我不明白您所说的“显式传递名称和捕获组”是什么意思。
  • 我想通过“PAY VALUES TO SUM - WITHOU NOTHING:”来获取匹配项,然后(在这么多单词或数字之后取一个值)(在这么多单词或数字之后取另一个值或数字(在这么多单词或数字之后取另一个值)(在这么多单词或数字之后取另一个值)。所以我可以查看 [1]、[2]、[3] 和 [4] 的值变量匹配。我知道这是完全可能的,但我不知道为什么,真的。
【解决方案5】:

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

Regex demo

    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]+ ' ');
    }

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多