我无法匹配两个特定单词之间的顺序

时间:2019-09-19 19:21:46

标签: regex

我想找到两个特定单词之间的字符串。在图片中看到我制作的图案。问题是“ INICIO”出现了两次,我只希望它与最后一次出现匹配,直到单词“ FIM”为止。在这种情况下,我希望第一个模式是INICIOBBBBBBBBBBBFBFIM。我需要匹配字符串中的所有匹配项。

Link to Regex

My Regex

4 个答案:

答案 0 :(得分:4)

您正在寻找的声音听起来像Rexegg所说的tempered greedy token

INICIO(?:(?!INICIO).)*?FIM

See your updated demo at regex101

否定的超前将使点“回火”,以使其不跳过另一个起点。这种做法的成本很高,因为如果在继续前进之前没有INICIO,则在每个位置之前,先行向前看。

如果有兴趣,there is a nice answer on SO对其进行详细说明。

答案 1 :(得分:0)

也许

.*(INICIO.*?FIM)

INICIO(?!.*\BINICIO\B)\B.*?\BFIM

可能没问题。


如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


Demo 2

答案 2 :(得分:0)

反转字符串,然后搜索

 MIF.*?OICINI

然后撤消比赛

 "JJJJJJJJJJJJJJJINICIOAAAAAAAAAAAAINICIOBBBBBBBBBBBBFIMJJJJJJJJJJJJJJINICIOJJJJJJJJJJJJJJFIM"
      .split("")
      .reverse()
      .join("")
      .match(/MIF.*?OICINI/g)[1]
      .split("")
      .reverse()
      .join("");

(注意,我实际上是在这里抢第二场比赛。这是因为比赛的顺序也相反)

答案 3 :(得分:0)

有些人为设计,但这可能有效:

(?<=INICIO).*?(INICIO.*?FIM)|(?<=FIM).*?(INICIO.*?FIM)

您的结果将在$2

https://regex101.com/r/qUf4kE/1