gpt4 book ai didi

javascript - 具有动态变量的正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:28 36 4
gpt4 key购买 nike

我有一个文件,里面有大量字符串,我需要使用以下模式将它们分开:“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 demo

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

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

参见another regex demo

区别在于惰性匹配被“展开”结构取代(参见 "Unrolling the loop" 文章)

在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
}

关于javascript - 具有动态变量的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33654565/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com