diff --git a/libaregexptree/src/RegExpOptimize.cpp b/libaregexptree/src/RegExpOptimize.cpp
index 36bbed75b6db8e43141ee998079ed5d302dccfa6..e2d9dfd059cae570659ae8b961487afe7e6523f9 100644
--- a/libaregexptree/src/RegExpOptimize.cpp
+++ b/libaregexptree/src/RegExpOptimize.cpp
@@ -649,7 +649,8 @@ bool RegExpOptimize::V5( Alternation * const & node )
                 // tmp->getElements( ).insert( tmp->getElements( ).end( ), std::next( itC ), concat->getElements( ).end( ) );
                 // std::cout << RegExp( tmp) << std::endl;
 
-                if( ! equal( iterConcat->getElements( ).begin( ), iterConcat->getElements( ).end( ), std::next( itC ),
+                if( distance( iterConcat->getElements( ).begin( ), iterConcat->getElements( ).end( ) ) != distance( std::next( itC ), concat->getElements( ).end( ) )
+                 || ! equal( iterConcat->getElements( ).begin( ), iterConcat->getElements( ).end( ), std::next( itC ),
                     [ ]( RegExpElement const * const & a, RegExpElement const * const & b ) -> bool{ return *a == *b; } ) )
                 {
                     itC++;
@@ -801,7 +802,9 @@ bool RegExpOptimize::V6( Alternation * const & node )
                 }
                 advance( itStartX, - (int)(iterConcat->getElements( ).size( ) ) );
 
-                if( ! equal( iterConcat->getElements( ).begin( ), iterConcat->getElements( ).end( ), itStartX,
+                if( distance( iterConcat->getElements( ).begin( ), iterConcat->getElements( ).end( ) ) != distance( itStartX, concat->getElements( ).end( ) )
+                    ||
+                    ! equal( iterConcat->getElements( ).begin( ), iterConcat->getElements( ).end( ), itStartX,
                     []( RegExpElement const * const & a, RegExpElement const * const & b ) -> bool{ return *a == *b; } ) )
                 {
                     itC++;
@@ -939,6 +942,7 @@ bool RegExpOptimize::V8( Concatenation * const & node )
             advance( it2, - (int)concat->getElements( ).size( ) );
 
             if( concat->containsEmptyString( ) &&
+                distance( concat->getElements( ).begin( ), concat->getElements( ).end( )) == distance ( it2, node->getElements( ).end( ) ) &&
                 equal( concat->getElements( ).begin( ), concat->getElements( ).end( ), it2, [] ( RegExpElement const * const & a, RegExpElement const * const & b ) -> bool { return *a == *b; } ) )
             {
                 optimized = true;