【问题标题】:Regex: Non fixed-width look around assertions?正则表达式:非固定宽度环顾断言?
【发布时间】:2016-04-15 03:04:58
【问题描述】:

我的大学要求我为他提供一个正则表达式,该正则表达式仅在测试字符串以
.rar.part1.rarpart01.rarpart001.rar (等等)结尾时匹配。

应该匹配:

foo.part1.rar
xyz.part01.rar
存档.rar
part3_is_the_best.rar

不应匹配:

foo.r61
bar.part03.rar
test.sfv

我立即想出了正则表达式\.(part0*1\.)?rar$But this does match for bar.part03.rar.

接下来我尝试在断言后面添加一个否定的外观:.*(?<!part\d*)\.(part\0*1\.)?rar$ 这也不起作用,因为环视断言需要固定宽度。

然后我尝试使用正则表达式条件。但这也没有用。

所以我的问题是:这甚至可以通过使用纯正则表达式来解决吗?

答案应该包含指向 regex101.com 的链接以提供有效的解决方案,或者解释为什么它不能使用纯正则表达式来工作。

【问题讨论】:

  • 一切都可以使用正则表达式来解决。
  • 正则表达式就像暴力一样——如果它不能解决你的问题,你就没有使用足够的! (至少 PCRE)

标签: regex


【解决方案1】:

您可以使用前瞻来验证原始正则表达式失败的一个案例(.rar.part 部分不是 0*1)是否可信:

^(?!.*\.part0*[^1]\.rar$).*\.(part0*1\.)?rar$

See it in action

【讨论】:

  • 很好!! Lookaheads 显然不需要固定宽度,只有 Lookbehinds。
  • 为了使它也匹配foo.part19.rar,我不得不将正则表达式更改为^(?!.*\.part(\d*[^1]|[^0]*1)\.rar$).*\.(part0*1\.)?rar$。 (但这不是最初测试用例的一部分)
【解决方案2】:

这是一个老问题,但这是另一种方法:

(?:\.part0*1\.rar|^(?<!\.)\w+\.rar)$

这个想法是匹配任一:

  • .part0*1.rar结尾的字符串(即foo.part01.rar、foo.part1.rar、bar.part001.rar),或
  • .rar 结尾且在此之前不包含任何其他点 (.) 的字符串。

适用于您的所有测试用例,以及额外的 foo.part19.rar

https://regex101.com/r/EyHhmo/2

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2011-01-25
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多