具有动态变量的Regex

Regex with dynamically variable

本文关键字:Regex 变量 动态      更新时间:2023-09-26

我有一个文件,里面有巨大的字符串,我需要使用模式"NºARQUIVO:"将它们分离出来。但为此,首先我需要识别子字符串"NºARQUIVO:"的第一个出现,然后创建真正的正则表达式,如下所示:

首先,我识别第一个"NºARQUIVO:"的出现http://www.regexr.com/3c652

因此:

let string = 'THE HUGE STRING'; // I'm not going to paste here because the string is too big.
let reg    = /.*?MINISTÉRIO DO TRABALHO E EMPREGO.*?Nº ARQUIVO:'s(['w-]+)/;
let match  = reg.exec(string)[0];

输出:

PA8Nm01j0oI0000-9

现在,我需要使用第二个正则表达式来分隔要提取的字符串的开始位置和结束位置。

let reg2   = new RegExp('(.*?MINISTÉRIO DO TRABALHO E EMPREGO.*'+ match + '.*?Z6:''s[''w]+''b)')
let match2 = reg.exec(string)[0];

输出:

All the text from the MINISTÉRIO DO TRABALHO E EMPREGO **** the first Z6: 0 after the last PA8Nm01j0oI0000-9

我想知道是否可以用一个正则表达式中的一个步骤来替换上面的两个步骤。

您可以使用

.*?MINISTÉRIO DO TRABALHO E EMPREGO.*?Nº ARQUIVO:'s(['w-]+).*?Z6:'s'w+'b
|-------------------------- 1 ----------------------------|--- 2 ------|

参见regex演示

但是,这个正则表达式效率太低。使用另一个相同的,但效率高得多的:

MINISTÉRIO DO TRABALHO E EMPREGO(?:[^N]*(?:N(?!º ARQUIVO:)[^N]*)*)Nº ARQUIVO:'s(['w-]+)(?:[^Z]*(?:Z(?!6:'s'w+)[^Z]*)*)Z6:'s'w+'b

查看另一个regex演示

不同之处在于,延迟匹配被"展开"的构造所取代(请参阅"展开循环"文章)

在JS中,您可以使用

var re = /MINISTÉRIO DO TRABALHO E EMPREGO(?:[^N]*(?:N(?!º ARQUIVO:)[^N]*)*)Nº ARQUIVO:'s(['w-]+)(?:[^Z]*(?:Z(?!6:'s'w+)[^Z]*)*)Z6:'s'w+'b/g;
var str = "<<HUGE_STRING>>";
var m;
while ((m = re.exec(str)) !== null) {
    // m[0] = whole match
    // m[1] = 'PA8Nm01j0oI0000-9'-like submatches
}