在匹配的字符串后获取数字和字符

时间:2015-08-24 18:25:07

标签: javascript regex node.js

我正在尝试在匹配的字符串后获取值:

Empregados/Avulsos 2.912,30
Empregados/Avulsos 7.310,06

有时值中有一个字符串。

这是否可以使用正则表达式?

我是这样想的:

    var match = data.replace(/\s\s+/g, ' ');

    var match_two = match.match([\n\r][ \t]*Retenção Lei 9.711/98[ \t]*([^\n\r]*));
    console.log(match_two);

首先我用一个替换所有空格。然后我尝试获取值'Retenção Lei 9.711/98'。但输出为'2'

我想制作一个正则表达式,它总是会在这些例子中得到下一个单词或数字:

Hour: get 12:12
Data: get 24/08
Solicitação get 2.912,30
Empregados/Avulsos get 1.452,00
Palavras separadas get 2.912,30

词:

'Solicitação',
'Retention xxx 9.999/99'
'Compensation'
'TET':
'VALUE - SOCIAL PREVÎ',
'VALUE - OTHERS',
'TOTAL TO GET',
'TABLES',
'COD GPX:',
'FXGE:',
'ALIX DC:',
'RXG AJUST',
'DATA:',
'HOUR:',

2 个答案:

答案 0 :(得分:3)

我将解决以下问题。你有一段包含文字和各种数字的文字。给定一个任意子字符串,您希望找到该子字符串的第一个匹配项并提取其后的第一个数字。

例如,如果子字符串是'Total',您可能希望使用此正则表达式:

/Total.*?(\d\S*)/

让我分解一下:

  • Total是您正在寻找的子字符串
  • .*表示您正在寻找任何字符零次或多次
  • ?表示您希望匹配尽可能少的字符
  • (打开捕获组:这些是您要提取的字符
  • \d匹配数字
  • \S*匹配除空白字符以外的任何内容,零次或多次
  • )关闭捕获组

请注意.匹配除\n\r等行尾字符之外的任何字符。如果您的文本包含此类字符,则在应用上述正则表达式之前,您需要使用可见空格字符(' ')替换它们。如果您的文本已分配给变量text,则可以执行以下操作,将所有空格字符(包括行尾字符)替换为可见空格:

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

另一个重要的一点是/Total.*?(\d\S*)/是一个固定的正则表达式。如果要为任何给定的子字符串创建正则表达式,则必须使用RegExp构造函数对其进行编译:

var re = new RegExp(substring + '.*?(\\d\\S*)');

请注意,我们将字符串传递给构造函数,因此我们必须在指定正则表达式时转义斜杠。我们在文字正则表达式中写\d\S的地方,我们必须在字符串中写\\d\\S

我们可以使用exec方法对字符串执行编译的正则表达式,测试结果以查看它是否为null,最后获取捕获组的内容:

var match = re.exec(text);
if (match === null) {
  return '';
}
return match[1];

下面的代码段在名为getNumberAfterSubstring(substring, text)的函数中实现此过程。单击代码下方的蓝色按钮,查看它在一段示例文本和一些示例子字符串上运行。

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

function getNumberAfterSubstring(substring, text) {
  var re = new RegExp(substring + '.*?(\\d\\S*)'),
      match = re.exec(text);
  if (match === null) {
    return '';       // If no match is found, return empty string.
  }
  return match[1];   // Otherwise return first parenthesized group.
}

var text = "Tabela 25 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ultricies ultricies auctor. Donec sodales pharetra ante, vitae suscipit metus mollis quis. Lorem ipsum dolor sit amet, Retention Law 0.000/00 consectetur adipiscing elit. Nunc nisl dui, Compension 00,00 ullamcorper eget posuere et, faucibus ut leo. Ut tellus nisi, lobortis eget nibh id, laoreet tincidunt lacus. Integer eget libero Value - Social prevî: 715,86 ut nulla vestibulum viverra eget sit Value - Others: 715,86 amet nisi. Suspendisse potenti.\nCurabitur ligula felis, Data: 02/02/2011 scelerisque in consequat et, tempor non ipsum. Donec euismod, turpis ut accumsan lobortis, lectus felis ullamcorper nibh, et pretium lectus nisl at enim. Total to pay 863,37 Nullam faucibus massa vitae nulla ultrices, eu sollicitudin justo imperdiet. Phasellus at est scelerisque, egestas diam et, rutrum dui. Hour: 15:44:58 Nunc sagittis hendrerit dui, sit amet congue arcu efficitur eu. Praesent hendrerit ut nibh vel vehicula. Morbi mollis enim ex, at mollis libero pellentesque quis. Etiam sed bibendum nisi. COD GPS: 2100 In hac habitasse platea dictumst. Morbi ac condimentum eros, in egestas tellus.";

text = text.replace(/\s/g, ' ');  // Replace line-ending characters.
text = text.toLocaleLowerCase();

var substrings = ['Retention Law', 'Compension', 'VALUE - SOCIAL PREVî',
                  'Total', 'Tabela', 'Hour', 'Data'];

for (var i = 0; i < substrings.length; ++i) {
  var substring = substrings[i].toLocaleLowerCase();
  print(substring + ': ' + getNumberAfterSubstring(substring, text));
}

答案 1 :(得分:0)

您的RegEx捕获组不包含小数或逗号,但数值包含小数或逗号。

var res = /Empregados\/Avulsos ([\d\.,:\/]+)/.exec(str);
if(res[1]){
   var values = res[1].split(",");
}

在Regex中, \ d 找到数字,而不是数字。示例中的数字可以由几个数字,小数点,逗号,冒号和斜杠组成。

请确保在正则表达式中包含这些内容。

相关问题