diff --git a/lib/config/presets/index.spec.ts b/lib/config/presets/index.spec.ts
index fa6e3f42dbb0ca00c5d9f4227d3285a3e2f8e20a..e560f956d57ad34006f648b0200e7cac0ecbc9cf 100644
--- a/lib/config/presets/index.spec.ts
+++ b/lib/config/presets/index.spec.ts
@@ -446,6 +446,17 @@ describe('config/presets/index', () => {
         presetSource: 'local',
       });
     });
+    it('parses local with spaces and subdirectory', () => {
+      expect(
+        presets.parsePreset('local>A2B CD/A2B_Renovate//some-dir/some-file')
+      ).toEqual({
+        repo: 'A2B CD/A2B_Renovate',
+        params: undefined,
+        presetName: 'some-file',
+        presetPath: 'some-dir',
+        presetSource: 'local',
+      });
+    });
     it('parses local with sub preset and tag', () => {
       expect(
         presets.parsePreset(
diff --git a/lib/config/presets/index.ts b/lib/config/presets/index.ts
index f926a19957ce9b20283a325e8d9d0d8dff42a261..04d1b0e84569c0b74d6d1c5762a249227bbed69f 100644
--- a/lib/config/presets/index.ts
+++ b/lib/config/presets/index.ts
@@ -38,7 +38,7 @@ const presetSources: Record<string, PresetApi> = {
 };
 
 const nonScopedPresetWithSubdirRegex = regEx(
-  /^(?<repo>~?[\w\-./]+?)\/\/(?:(?<presetPath>[\w\-./]+)\/)?(?<presetName>[\w\-.]+)(?:#(?<tag>[\w\-./]+?))?$/
+  /^(?<repo>~?[\w\-. /]+?)\/\/(?:(?<presetPath>[\w\-./]+)\/)?(?<presetName>[\w\-.]+)(?:#(?<tag>[\w\-./]+?))?$/
 );
 const gitPresetRegex = regEx(
   /^(?<repo>~?[\w\-. /]+)(?::(?<presetName>[\w\-.+/]+))?(?:#(?<tag>[\w\-./]+?))?$/