我需要确认在我的文本的一部分之间是否存在一个\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不存在,正则表达式试图捕捉文本的其他部分,正如您在此处所见:http://regexr.com/3d03m
我怎样才能使正则表达式只在这两个单词之间起作用?有可能吗?
正则表达式:(?: RESUMO DO FECHAMENTO - EMPRESA MODALIDADE : "BRANCO")(.*? 01 )(?:.*?(?=TOTAIS:))
答案 0 :(得分:1)
你遇到的问题是.*?
- 虽然叫做“#34;懒惰"或者"不情愿的" - 仍然尝试匹配尽可能多的字符以返回有效匹配。由于.
匹配除换行符之外的任何字符,因此它与您的前导多字符分隔符(以及尾随符号)匹配。
如果您有1个字符分隔符,例如[
或]
,则可以使用否定字符类 [^\]\[]*
而不是.*?
。在这里,你可以使用一个驯化的贪婪令牌:
(?:(?!TOTAIS:).)*
请参阅regex demo
要支持多行文字,.
必须替换为[\s\S]
。
然而,这个解决方案相当耗费资源,因为我们基本上检查每个位置,如果它开始TOTAIS:
的序列,我们就会停止匹配。更有效的方法是将此令牌展开,例如:
[^T]*(?:T(?!OTAIS:)[^T]*)*
此版本也适用于新行。它匹配除T
以外的0 *字符,然后是T
的0 *序列,其后面没有OTAIS:
,后跟0 T
以外的字符。但是,它无法检查TOTAIS
是否完整。
答案 1 :(得分:0)
我不明白你要做什么..对不起.. 但根据你的标题“在两个单词之间应用正则表达式”, 我假设,如果“01”和“07”到来,你想在它之间加上逗号。 如果是这种情况,那么它将是:(Perl)
S /(01)\ S +(07)/ \ 1,\ 2 \ 3 /克;