diff --git a/lib/modules/versioning/regex/index.spec.ts b/lib/modules/versioning/regex/index.spec.ts
index e8dd5e3dfab6c9914fe34fe5615e0a95ce1af13f..e9070d7de7fc1c044d24c1482006011189e22ff6 100644
--- a/lib/modules/versioning/regex/index.spec.ts
+++ b/lib/modules/versioning/regex/index.spec.ts
@@ -1,9 +1,9 @@
-import { VersioningApi, get } from '..';
+import { get } from '..';
 import { CONFIG_VALIDATION } from '../../../constants/error-messages';
 
 describe('modules/versioning/regex/index', () => {
   describe('regex versioning', () => {
-    const regex: VersioningApi = get(
+    const regex = get(
       'regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?<prerelease>[^.-]+)?(?:-(?<compatibility>.*))?$'
     );
 
@@ -11,6 +11,16 @@ describe('modules/versioning/regex/index', () => {
       expect(() => get('regex:not a regex')).toThrow();
     });
 
+    it('works without config', () => {
+      const re = get('regex');
+      expect(re.isValid('alpine')).toBeFalse();
+    });
+
+    it('works with missing version', () => {
+      const re = get('regex:^(?<major>\\d+)?(?<compabillity>.+)');
+      expect(re.isValid('alpine')).toBeTrue();
+    });
+
     describe('throws', () => {
       for (const re of [
         '^(?<major>\\d+)(',
@@ -43,7 +53,7 @@ describe('modules/versioning/regex/index', () => {
       ${'1.2.aardvark-foo'} | ${false}
       ${'1.2a2.3'}          | ${false}
     `('isValid("$version") === $expected', ({ version, expected }) => {
-      expect(!!regex.isValid(version)).toBe(expected);
+      expect(regex.isValid(version)).toBe(expected);
     });
 
     test.each`
@@ -342,9 +352,9 @@ describe('modules/versioning/regex/index', () => {
     );
   });
 
-  describe('Supported 4th number as build', () => {
+  describe('Supported 4th number as build and 5th as revision', () => {
     const re = get(
-      'regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(:?-(?<compatibility>.*-r)(?<build>\\d+))?$'
+      'regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(:?-(?<compatibility>.+)(?<build>\\d+)-r(?<revision>\\d+))?$'
     );
 
     test.each`
diff --git a/lib/modules/versioning/regex/index.ts b/lib/modules/versioning/regex/index.ts
index c77ee139a83c90942ec55c36bc25f1a4f31734b4..a11369635d481710f22a1db5ff05304ad332049c 100644
--- a/lib/modules/versioning/regex/index.ts
+++ b/lib/modules/versioning/regex/index.ts
@@ -71,7 +71,8 @@ export class RegExpVersioningApi extends GenericVersioningApi<RegExpVersion> {
       return null;
     }
 
-    const { major, minor, patch, build, prerelease, compatibility } = groups;
+    const { major, minor, patch, build, revision, prerelease, compatibility } =
+      groups;
     const release = [
       typeof major === 'undefined' ? 0 : Number.parseInt(major, 10),
       typeof minor === 'undefined' ? 0 : Number.parseInt(minor, 10),
@@ -80,6 +81,9 @@ export class RegExpVersioningApi extends GenericVersioningApi<RegExpVersion> {
 
     if (build) {
       release.push(Number.parseInt(build, 10));
+      if (revision) {
+        release.push(Number.parseInt(revision, 10));
+      }
     }
 
     return {
diff --git a/lib/modules/versioning/regex/readme.md b/lib/modules/versioning/regex/readme.md
index cabd8e88b08db6b0f4d56864246a6e36eec92272..9d7f3e17066a59b66e25ae1c44d138f91d1179bf 100644
--- a/lib/modules/versioning/regex/readme.md
+++ b/lib/modules/versioning/regex/readme.md
@@ -5,6 +5,7 @@ The valid capture groups for `regex` versioning are:
 
 - `major`, `minor`, and `patch`: at least one of these must be provided. When determining whether a package has updates, these values will be compared in the standard semantic versioning fashion. If any of these fields are omitted, they will be treated as if they were `0` -- in this way, you can describe versioning schemes with up to three incrementing values.
 - `build`: this capture group can be used after you've already used the `major`, `minor` and `patch` capture groups and need a fourth version part. `build` updates are handled like `patch` updates.
+- `revision`: this capture group can be used after you've already used the `build` capture groups and need a fifth version part. `revision` updates are handled like `patch` updates.
 - `prerelease`: this value, if captured, will mark a given release as a prerelease (e.g. unstable). If this value is captured and you have configured `"ignoreUnstable": true`, the given release will be skipped.
 - `compatibility`: this value defines the "build compatibility" of a given dependency. A proposed Renovate update will never change the specified compatibility value. For example, if you are pinning to `1.2.3-linux` (and `linux` is captured as the compatibility value), Renovate will not update you to `1.2.4-osx`.
 
@@ -37,7 +38,7 @@ Here is another example, this time for handling `python` Docker images, which us
 }
 ```
 
-Here is another example, this time for handling Bitnami Docker images, which use build indicators as well as version suffixes for compatibility:
+Here is another example, this time for handling Bitnami Docker images, which use `build` and `revision` indicators as well as version suffixes for compatibility:
 
 ```json
 {
@@ -45,7 +46,7 @@ Here is another example, this time for handling Bitnami Docker images, which use
     {
       "matchDatasources": ["docker"],
       "matchPackagePrefixes": ["bitnami/"],
-      "versioning": "regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(:?-(?<compatibility>.*-r)(?<build>\\d+))?$"
+      "versioning": "regex:^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(:?-(?<compatibility>.+)(?<build>\\d+)-r(?<revision>\\d+))?$"
     }
   ]
 }