【问题标题】:Apply regex between two words在两个单词之间应用正则表达式
【发布时间】:2016-03-11 22:29:11
【问题描述】:

我需要确认我的文本的一部分之间是否存在一个\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:))

【问题讨论】:

  • 我不清楚,您要捕获什么文本?你想要的输出是什么?
  • 你能举个小样本的例子吗?不能完全掌握你想要什么。
  • 在我的文本中,我试图确认 RESUMO DO FECHAMENTO - EMPRESA MODALIDADE : "BRANCO" 和第一个 TOTAL: 之间是否存在 01 和 07,问题是,我还有其他TOTAL 在文本中,所以如果 01 在这两个词之间不存在,正则表达式将尝试与下一个 TOTAL 匹配。
  • 那么,demo中的文字应该完全不匹配吧?尝试用(?:(?!TOTAIS:).)* 替换所有.*?。虽然这不是最好的解决方案,但最好使用展开的版本 (.*? --> [^T]*(?:T(?!OTAIS:)[^T]*)*)。
  • 是的!现在正在工作,你能给我解释一下吗?而且..这是一个展开的版本??

标签: javascript regex


【解决方案1】:

您遇到的问题是.*? - 尽管被称为“懒惰”或“不情愿” - 仍然尝试匹配尽可能多的字符以返回有效匹配。由于. 匹配除换行符以外的任何字符,它匹配您的前导多字符分隔符(以及尾随)。

如果您有 1 个字符分隔符,例如 [],您将使用 否定字符类 [^\]\[]* 而不是 .*?。在这里,您可以使用经过调和的贪婪令牌:

(?:(?!TOTAIS:).)*

regex demo

要支持多行文本,. 必须替换为 [\s\S]

然而,这个解决方案相当消耗资源,因为我们基本上检查每个位置,如果它开始TOTAIS:的序列,我们停止匹配。一种更有效的方法是展开此令牌,例如:

[^T]*(?:T(?!OTAIS:)[^T]*)*

another regex demo

这个版本也匹配换行符。它匹配除 T 之外的 0* 个字符,然后匹配 T 的 0* 序列,该序列后面没有 OTAIS:,后跟 0* 出现的除 T 之外的字符。但是,它无法检查TOTAIS 是否是一个完整的单词。

【讨论】:

  • 我现在很忙,有不清楚的地方请留言,我半小时后回复。
  • 谢谢,太好了!
  • 什么是缓和的贪婪令牌? :B.
  • 这里是tempered greedy token的一些解释。它基于点匹配与负前瞻,防止溢出分隔符。
【解决方案2】:

我不明白你要做什么..对不起.. 但是根据您的标题“在两个单词之间应用正则表达式”, 我假设,如果出现“01”和“07”,你想在它们之间加上逗号。 如果是这样的话,那就是:(Perl)

s/(01)\s+(07)/\1,\2\3/g;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2013-12-02
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
相关资源
最近更新 更多