【问题标题】:solving regex with positive lookbehind用积极的后视解决正则表达式
【发布时间】:2018-10-03 16:31:50
【问题描述】:

正则表达式问题。我想让下面的前四个字符串匹配。输出应该是 _. 之间的 3 个字符。

因此这些将匹配:

_20101_Bp16tt20_KG2.asc _201_Bondp0_KGB.ASC _2011_rndiep16tt20_232.AsC _20101_odiep16tt20_ab3.ASC

应该分别返回KG2KGB232ab3

这些将不匹配:

_2_ordep16tt.asc __Bndt20_pippo_K.asc

我可以通过 ((?<=_)(...)(\.(?i)(asc))) 选择整个块 _KG2.asc。但是,我只想要KG2。我认为我应该积极地向后看,但我的尝试都失败了。你能帮帮我吗?

【问题讨论】:

  • 您需要积极向前看而不是向后看。试试_\K...(?=\.)

标签: regex pcre lookbehind


【解决方案1】:

您可以使用\K 和积极的前瞻:

_\K[A-Za-z0-9]{3}(?=\.(?i)asc$)

Regex demo

那会匹配

  • _ 字面匹配
  • \K忘记上一场比赛
  • [A-Za-z0-9]{3} 匹配大小写字符或数字的 3 次(如果要匹配任何字符,请替换为点)
  • (?=\.(?i)asc$) 正向前瞻断言后面是小写或大写的点和 asc 并断言字符串的结尾

【讨论】:

  • 这匹配 _2_ordep16tt.asc__Bndt20_pippo_K.asc
  • :) 看起来不错。在您的正则表达式演示中包含这两行可能会很好
  • 未明确提及所有匹配项不一定以字母K 开头。我的错,我应该提供更多的例子
  • @giosans \K 与字母 K 字面上不匹配,但它会重置报告匹配的起点。我已经添加了解释。
  • @giosans 这个答案有效,您可以在链接中看到。 _\K 功能类似于 (?<=_)
【解决方案2】:

也使用前瞻

((?<=_)(...)(?=\.(?i)(asc)))

https://regexr.com/40jfa

【讨论】:

    【解决方案3】:

    也许这个表达对你有帮助..

    '_201_Bondp0_KGB.ASC'.match(/(?<=_)(...)(?=\.)/g)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      相关资源
      最近更新 更多