使用正则表达式捕获两组数字

6 javascript regex

我有这个文字:

'BASE CÁL PREV SOC BASE CÁL 13º 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 13 5 10.517,81 0,00 10.517,81 0,00 TOTAIS: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38'
Run Code Online (Sandbox Code Playgroud)

不替换空格和断行的原始格式为:

NUMBER    OTHER      OTHER        OTHER        BASE CÁL PREV SOC  BASE CÁL 13º PREV SOC 

01        672     1.653.806,09   18.512,98       1.667.621,57        2.647,38
07         23        12.965,11        0,00          12.965,11            0,00
13         05        10.517,87        0,00          10.517,81            0,00
TOTAL:    700     1.677.289,00   18.512,98       1.691.104,49        2.647,38
Run Code Online (Sandbox Code Playgroud)

我想BASE CÁL PREV SOC仅在行01和07中提取列中的信息,但有时07不存在.第13行将被忽略.

所以我希望在一个正则表达式中有一个给定的短语和匹配的组.

需要明确的是,这些数据是在一个巨大的文本中,因此正则表达式不能是通用的.我必须明确传递一个接近数字的唯一短语.这里选择的短语是'BASE CÁL PREV SOC BASE CÁL 13º PREV SOC'.我只想得到01和07中的数字(虽然07有时不存在),并忽略13.

为了更清楚,在当前的例子中,我预计结果为1.667.621.57和12.965,11.

我有这个代码:

var text = 'BASE CÁL PREV SOC BASE CÁL 13º 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 13 5 10.517,81 0,00 10.517,81 0,00 TOTAIS: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38';

var reg   = new RegExp('BASE CÁL PREV SOC BASE CÁL 13º PREV SOC' + '\\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]);
Run Code Online (Sandbox Code Playgroud)

我必须确定该号码是01和07,如果没有07,请将其替换为00,00.

这可能吗?

Mic*_*zlo 6

要匹配文本中可能不出现的组,请使用?组末尾的修饰符,如下所示:

'(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?'
Run Code Online (Sandbox Code Playgroud)

在您的情况下,完整的正则表达式如下所示:

var re = RegExp('BASE CÁL PREV SOC BASE CÁL 13º PREV SOC' + 
                   '.*?\\s+01(?:\\s+\\S+){3}\\s+(\\S+)' + 
                '(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?');
Run Code Online (Sandbox Code Playgroud)

正则表达式定义的第一部分是您正在寻找的短语.让我们分解第二部分:

  • .*? 匹配任何类型的零个或多个字符(行终止字符除外)尽可能少
  • \\s+ 匹配一个或多个空白字符
  • 01 匹配行号
  • (?:\\s+\\S+) 是一个非捕获组,它匹配一个或多个空白字符,后跟一个或多个非空白字符
  • {3}使(?:\\s+\\S+)小组比赛三次
  • \\s+ 匹配一个或多个空白字符
  • (\\S+) 捕获一个或多个非空白字符 - 这是我们正在寻找的值

正则表达式的第三部分类似于第二部分,除了它07代替01,并且,至关重要的是,它包含在非捕获的可选组中.

  • (?: 开始一个非捕获组
  • )? 结束组并使其成为可选项

重要的是?在小组的右括号之后.这?使得整个组可选:它可以匹配,也可以不匹配.该组不是非必要的非捕获.如果我们?:在开括号之后省略了正则表达式,那么正则表达式仍然有效,除非我们必须使用match[3]07行中提取值.

执行正则表达式后,无法匹配的组将具有该值undefined.您可以替换您选择的值,如下所示:

var value07 = match[2] || '0,00';
Run Code Online (Sandbox Code Playgroud)

在以下代码段中,尝试替换07内容08以查看发生的情况.

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

// Replace all whitespace with visible spaces.
text = text.replace(/\s+/g, ' ');

var re = RegExp('(?:.*BASE CÁL PREV SOC BASE CÁL 13º PREV SOC)+' +
                '(?:.*?\\s+01(?:\\s+\\S+){3}\\s+(\\S+))?' + 
                '(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?');

var match = re.exec(text),
    value01 = match[1] || '0,00',
    value07 = match[2] || '0,00';

document.write(value01 + '<br><br>');
document.write(value07 + '<br><br>');
Run Code Online (Sandbox Code Playgroud)
body {
  font-family: sans-serif;
}
#content {
  color: #888;
  margin: 20px 0;
  display: none;
}
Run Code Online (Sandbox Code Playgroud)
<div id="content">
NUMBER    OTHER      OTHER        OTHER        BASE CÁL PREV SOC  BASE CÁL 13º PREV SOC 

01        672     1.653.806,09   18.512,98       1.111.111,11        2.647,38
07         23        12.965,11        0,00          11.111,11            0,00
13         05        10.517,87        0,00          10.517,81            0,00
TOTAL:    700     1.677.289,00   18.512,98       1.691.104,49        2.647,38
  
NUMBER    OTHER      OTHER        OTHER        BASE CÁL PREV SOC  BASE CÁL 13º PREV SOC 

01        672     1.653.806,09   18.512,98       2.222.222,22        2.647,38
07         23        12.965,11        0,00          22.222,22            0,00
13         05        10.517,87        0,00          10.517,81            0,00
TOTAL:    700     1.677.289,00   18.512,98       1.691.104,49        2.647,38
  
NUMBER    OTHER      OTHER        OTHER        BASE CÁL PREV SOC  BASE CÁL 13º PREV SOC 

01        672     1.653.806,09   18.512,98       3.333.333,33        2.647,38
07         23        12.965,11        0,00          33.333,33            0,00
13         05        10.517,87        0,00          10.517,81            0,00
TOTAL:    700     1.677.289,00   18.512,98       1.691.104,49        2.647,38
</div>
Run Code Online (Sandbox Code Playgroud)