正则表达式:匹配 ([^A-Z]*) 但如果找到 "foo" 则停止

RegEX: match ([^A-Z]*) but stop if you find "foo"

我 运行 遇到了一个我不知道如何解决的问题。 我有一系列的视频文件,名称如下:

FooBar-tooGGG1 - s01e01 - (HW) - SomeText.mp4

因此我必须确保在大写字母之前添加空格,但仅在出现“- s01e”之前添加(因此忽略文本的其余部分):

Foo Bar-too GGG 1 - s01e01 - (HW) - SomeText.mp4

环顾四周,我偶然发现了这些 RegEX:

(?-i)([A-Z]{1})([^A-Z]*)

替换为:


.+?(?=abc)

\w*(?<!foo)bar

^(?:(?!foo).)*

这在 Regex101 上发挥了一点作用,但我不能只得到两种类型的结果:

(?-i)([A-Z]{1})([^A-Z]*.+?(?= - s01e))

(?-i)([A-Z]{1})([^A-Z]*)/g

分别为:

F ooBar-tooGGG1 - s01e01 - (HW) - SomeText.mp4

Foo Bar-too GGG1 - s01e01 - ( H W) -  Some Text.mp4

我不太擅长正则表达式,但从今天早上开始我一直在尝试一切,放在中间,使用 +?而不是 * o。 *等

正则表达式引擎:PCRE2; PCRE。 如果批量重命名不适合作为软件,我还有: FlexibleRenamer 和 RegexRenamer(也适用于 Windows)

在批量重命名实用程序中,您可以使用

(?<=[a-z])(?=[A-Z])(?=.*\s[sS]\d{1,2}[eE]\d)/g

将替换设置为 space。确保已设置 v2 复选框。

您也可以使用 Powershell(CTRL+Esc,开始输入 Powershell 并按 ENTER):

cd 'FILES_FOLDER_PATH_HERE'
$files = Get-ChildItem -Filter '*.mp4'
$files | Rename-Item  -NewName {$_.name -creplace '(?<=\p{Ll})(?=\p{Lu})(?=.*\s[sS]\d{1,2}[eE]\d)',' ' }

这里是 regex demo.

详情

  • cd 'FILES_FOLDER_PATH_HERE' - 移动到包含您的文件的文件夹
  • $files = Get-ChildItem -Filter '*.mp4' - 获取该文件夹中扩展名为 mp4 的所有文件
  • $files | Rename-Item -NewName {$_.name -creplace '(?<=\p{Ll})(?=\p{Lu})(?=.*\s[sS]\d{1,2}[eE]\d)',' ' } 使用区分大小写(由于 -creplace)正则表达式搜索和替换重命名文件。

正则表达式匹配

  • (?<=\p{Ll}) - 一个紧跟小写字母的位置(\p{Ll}[a-z] 的 Unicode 变体)
  • (?=\p{Lu}) - 紧跟大写字母的位置(\p{Lu}[A-Z] 的 Unicode 变体)
  • (?=.*\s[sS]\d{1,2}[eE]\d) - 紧随其后的位置
    • .* - 任何文本(换行符除外)
    • \s - 白space
    • [sS] - sS
    • \d{1,2} - 一位或两位数
    • [eE] - eE
    • \d - 一个数字。