Index: /trunk/src/VBox/Runtime/common/string/strversion.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/string/strversion.cpp	(revision 35075)
+++ /trunk/src/VBox/Runtime/common/string/strversion.cpp	(revision 35076)
@@ -56,5 +56,7 @@
     const char *psz = *ppszVer;
 
-    /* Check for end-of-string. */
+    /*
+     * Check for end-of-string.
+     */
     if (!*psz)
     {
@@ -64,10 +66,14 @@
     }
 
+    /*
+     * Try convert the block to a number the simple way.
+     */
+    char ch;
     bool fNumeric = RT_C_IS_DIGIT(*psz);
     if (fNumeric)
     {
         do
-            psz++;
-        while (*psz && RT_C_IS_DIGIT(*psz));
+            ch = *++psz;
+        while (ch && RT_C_IS_DIGIT(ch));
 
         int rc = RTStrToInt32Ex(*ppszVer, NULL, 10, pi32Value);
@@ -81,32 +87,63 @@
     else
     {
+        /*
+         * Find the end of the current string.  Make a special case for SVN
+         * revision numbers that immediately follows a release tag string.
+         */
         do
-            psz++;
-        while (*psz && !RT_C_IS_DIGIT(*psz) && !RTSTRVER_IS_PUNCTUACTION(*psz));
+            ch = *++psz;
+        while (    ch
+               && !RT_C_IS_DIGIT(ch)
+               && !RTSTRVER_IS_PUNCTUACTION(ch));
+
         size_t cchBlock = psz - *ppszVer;
-
-        /* Translate standard pre release terms to negative values. */
-        int32_t iVal1;
-        if (     cchBlock == 2 && !RTStrNICmp(*ppszVer, "RC", 2))
-            iVal1 = -100000;
-        else if (cchBlock == 3 && !RTStrNICmp(*ppszVer, "PRE", 3))
-            iVal1 = -200000;
-        else if (cchBlock == 5 && !RTStrNICmp(*ppszVer, "GAMMA", 5))
-            iVal1 = -300000;
-        else if (cchBlock == 4 && !RTStrNICmp(*ppszVer, "BETA", 4))
-            iVal1 = -400000;
-        else if (cchBlock == 5 && !RTStrNICmp(*ppszVer, "ALPHA", 5))
-            iVal1 = -500000;
-        else
-            iVal1 = 0;
+        if (   cchBlock > 1
+            && psz[-1] == 'r'
+            && RT_C_IS_DIGIT(*psz))
+        {
+            psz--;
+            cchBlock--;
+        }
+
+
+        /*
+         * Translate standard pre release terms to negative values.
+         */
+        static const struct
+        {
+            size_t      cch;
+            const char *psz;
+            int32_t     iValue;
+        } s_aTerms[] =
+        {
+            { 2, "RC",      -100000 },
+            { 3, "PRE",     -200000 },
+            { 5, "GAMMA",   -300000 },
+            { 4, "BETA",    -400000 },
+            { 5, "ALPHA",   -500000 }
+        };
+
+        int32_t iVal1 = 0;
+        for (unsigned i = 0; i < RT_ELEMENTS(s_aTerms); i++)
+            if (   cchBlock == s_aTerms[i].cch
+                && !RTStrNCmp(s_aTerms[i].psz, *ppszVer, cchBlock))
+            {
+                iVal1 = s_aTerms[i].iValue;
+                break;
+            }
         if (iVal1 != 0)
         {
-            /* Trailing number? Add it assuming BETA == BETA1. */
+            /*
+             * Does the prelease term have a trailing number?
+             * Add it assuming BETA == BETA1.
+             */
             if (RT_C_IS_DIGIT(*psz))
             {
                 const char *psz2 = psz;
                 do
-                    psz++;
-                while (*psz && !RT_C_IS_DIGIT(*psz) && !RTSTRVER_IS_PUNCTUACTION(*psz));
+                    ch = *++psz;
+                while (   ch
+                       && RT_C_IS_DIGIT(ch)
+                       && !RTSTRVER_IS_PUNCTUACTION(ch));
 
                 int rc = RTStrToInt32Ex(psz2, NULL, 10, pi32Value);
@@ -125,5 +162,7 @@
     *pcchBlock = psz - *ppszVer;
 
-    /* skip punctuation */
+    /*
+     * Skip trailing punctuation.
+     */
     if (RTSTRVER_IS_PUNCTUACTION(*psz))
         psz++;
Index: /trunk/src/VBox/Runtime/testcase/tstRTStrVersion.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstRTStrVersion.cpp	(revision 35075)
+++ /trunk/src/VBox/Runtime/testcase/tstRTStrVersion.cpp	(revision 35076)
@@ -86,5 +86,5 @@
         { "3.1.0_BETA-r12345",          "3.1.2",                            -1 },
         { "3.1.0_BETA1r12345",          "3.1.0",                            -1 },
-        { "3.1.0_BETAr12345",           "3.1.0",                             1 }, /* not considered a beta because of missing punctuation */
+        { "3.1.0_BETAr12345",           "3.1.0",                            -1 },
         { "3.1.0_BETA-r12345",          "3.1.0",                            -1 },
         { "3.1.0_BETA-r12345",          "3.1.0",                            -1 },
@@ -99,4 +99,11 @@
         { "3.1.0_BETA2",                "3.1.0_ABC",                        -1 }, /* ABC isn't indicating a prerelease, BETA does */
         { "3.1.0_BETA",                 "3.1.0_ATEB",                       -1 },
+        { "4.0.0_ALPHAr68482",          "4.0.0_ALPHAr68483",                -1 },
+        { "4.0.0_ALPHA1r68482",         "4.0.0_ALPHAr68482",                 0 },
+        { "4.0.0_ALPHA-r68482",         "4.0.0_ALPHAr68482",                 0 },
+        { "4.0.0_ALPHAr68483",          "4.0.0_BETAr68783",                 -1 },
+        { "4.0.0_ALPHAr68483",          "4.0.0_BETA1r68783",                -1 },
+        { "4.0.0_ALPHAr68483",          "4.0.0_BETA2r68783",                -1 },
+        { "4.0.0_ALPHAr68483",          "4.0.0_BETA2r68784",                -1 },
     };
     for (unsigned iTest = 0; iTest < RT_ELEMENTS(aTests); iTest++)
