我需要确认文本的一部分之间是否存在 \s01\s
,所以我需要一个分隔符。
我有这么大的文本:
...
RESUMO DO FECHAMENTO - EMPRESA MODALIDADE : "BRANCO"-RECOLHIMENTO AO FGTS E DECLARAÇÃO À PREVIDÊNCIA 858600000039 672701801102 107527053051 769205500015 Nº ARQUIVO: NmDA0FH71Ig0000-3 Nº DE CONTROLE: BdmBPppCuyu0000-1 INSCRIÇÃO: 57.692.055/0001-27 COMP: 11/2010 COD REC:115 COD GPS: 2100 FPAS: 612 OUTRAS ENT: 3139 SIMPLES: 1 RAT: 3.0 FAP: 1.57 RAT AJUSTADO: 4.71 TOMADOR/OBRA: INSCRIÇÃO: LOGRADOURO: AVENIDA ALEXANDRE COLARES 500 3 ANDAR BAIRRO: VILA JAGUARA CNAE PREPONDERANTE: 4930202 CIDADE: SAO PAULO UF: SP CEP: 05106-000 CNAE: 4930202 CAT QUANT REMUNERAÇÃO SEM 13º REMUNERAÇÃO 13º BASE CÁL PREV SOC BASE CÁL 13º PREV SOC 07 2 1.100,35 429,09 1.100,35 0,00
...
在这个特别的片段中,我需要确认是否存在 01 和 07,但如果 01 不存在,正则表达式会 try catch 文本的其他部分,如您在此处看到的:http://regexr.com/3d03m
我怎样才能使正则表达式仅在这两个单词之间工作?可能吗?
正则表达式:(?: RESUMO DO FECHAMENTO - EMPRESA MODALIDADE : "BRANCO")(.*? 01 )(?:.*?(?=TOTAIS:))
最佳答案
您遇到的问题是 .*?
- 尽管被称为“懒惰”或“不情愿” - 仍然尝试匹配尽可能多的字符以返回有效的匹配项。由于 .
匹配除换行符之外的任何字符,因此它与您的前导多字符分隔符(以及尾随)匹配。
如果您有 1 个字符分隔符,例如 [
或 ]
,您将使用否定字符类 [^\]\[]*
而不是 .*?
。在这里,您可以使用经过调和的贪婪 token :
(?:(?!TOTAIS:).)*
请参阅regex demo
要支持多行文本,.
必须替换为 [\s\S]
。
但是,这个解决方案相当消耗资源,因为我们基本上检查每个位置,如果它开始 TOTAIS:
序列,我们就会停止匹配。更有效的方法是展开此 token ,例如:
[^T]*(?:T(?!OTAIS:)[^T]*)*
这个版本也匹配换行符。它匹配除 T
之外的 0* 个字符,然后匹配 T
的 0* 序列,该序列后面没有 OTAIS:
,后跟 0* 出现的T
以外的字符。但是,它无法检查 TOTAIS
是否是一个完整的单词。
关于javascript - 在两个单词之间应用正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35942316/