【问题标题】:How to find the last A that the rest string contains the first B in RegEx?如何在RegEx中找到其余字符串包含第一个B的最后一个A?
【发布时间】:2016-03-23 16:31:12
【问题描述】:

我有大量的文件要重命名,这些文件的名称包含混沌后缀。我正在使用一些高级重命名软件,想知道如何编写一个 RegEx 来删除后缀。一些例子是:

Content - Still content-A pOst fix
Content-- BpOst - fix with - inside (dashes in postfix)
Content-Still --Content  -CpOstfix (dashes in content)
Content fake pOst - real pOst --fix (two keywords, one in content and postfix each)
Content fake- pOst - real pOst --fix (two keywords both in postfix)
Content fake pOst fix (space is not a splitter of pOstfix, so nothing removed)

我希望输出删除所有后期修复,包括前导破折号和/或空格。所需的输出是:

Content - Still content
Content
Content-Still --Content
Content fake pOst
Content fake
Content fake pOst fix (space is not a splitter of pOstfix, so nothing removed)

我什至不知道 RegEx 是否可以做到这一点。

不确定数量的破折号(带或不带空格)是后缀的分隔符,但内容或后缀都可能包含破折号和/或修复,但也就是说,所有后缀都包含特定的字母(例如在本例中为 O 或 pOst)。

有几点:

  1. 内容和后缀之间的分隔符只有破折号,如果只有空格,则不是分隔符。
  2. 短划线和空格可能同时包含在内容和后缀中,因此我不能简单地搜索第一个/最后一个破折号作为分隔符 - 它是第一次出现特定字母之前的最后一个破折号,包括前导空格( s) 已找到(参见最后一个示例)。
  3. 我想找到一种编写单个 RegEx 表达式的方法,而不是逐渐删除后缀。
  4. 整个文件名可能包含非 ASCII 字符,尤其是 certain letter(s)。所以使用[a-zA-Z]之类的东西并不理想。

PS:我也想知道如何为包含A但不包含B的字符类?

例如,我想要所有字母数字,但不包括字母 a 和数字 5,类似于(显然不起作用):/[\w^a5]+/。除了像/[b-zA-Z0-46-9]/ 这样写一个详尽的列表,还有什么更好的方法吗?比如联合和交叉点?

我真诚地感谢任何帮助。非常感谢。

【问题讨论】:

  • 一个正则表达式本身只匹配(部分)字符串。这个“高级重命名软件”究竟有什么能力,它能够用其他内容替换正则表达式匹配吗?它允许捕获组吗?它使用什么正则表达式实现?链接(文档)或至少命名软件会有所帮助。
  • @Bergi 谢谢。我在 PC 上使用 Advanced Renamer,在 Mac 上使用 A Better Finder Rename。你说的捕获组是什么意思? RegEx 的实施是什么意思?有任何不同的正则表达式吗?抱歉,我正在学习 RegEx,所以了解不多,我宁愿找不到任务的替代品,因为我也在努力提高我在 RegEx 中的技能。再次感谢。
  • 你读过advancedrenamer.com/user_guide/regular_expresions?如果没有,你真的应该这样做。它还包含我正在寻找的信息。

标签: regex pcre


【解决方案1】:

你应该可以替换

\s*-+\s*[^O-]*O.*$

使用空字符串。它将匹配一个或多个破折号(由可选空格包围),然后在输入结束前至少匹配一个O。

如果你想匹配整个短语,你需要像这样使用negative lookahead:

\s*-+\s*((?!pOst)[^-])*pOst.*$

【讨论】:

  • 谢谢。也感谢您在评论中的链接。但是,我试过你的表达方式,它不起作用:(
  • 谢谢,这样效果更好。但还是一个小修正:\s*-+\s*[^O-]*O.*$,否则总是从第一个-开始。 PS,如何修改它以匹配pOst而不是O?
  • @TideGu:谢谢,我也错过了……更新了答案。
  • 太棒了!谢谢!
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多