diff -rupN webform_validation.old/webform_validation.validators.inc webform_validation/webform_validation.validators.inc
--- webform_validation.old/webform_validation.validators.inc	2013-03-08 16:36:00.443970741 -0500
+++ webform_validation/webform_validation.validators.inc	2013-03-08 17:04:57.018803868 -0500
@@ -251,6 +251,22 @@ function webform_validation_webform_vali
       ),
       'description' => t("Validates that user-entered data matches a username"),
     ),
+    'pattern' => array(
+      'name' => "Pattern",
+      'component_types' => array(
+        'textfield',
+        'hidden',
+      ),
+      'custom_error' => TRUE,
+      'custom_data' => array(
+        'label' => t('Pattern'),
+        'description' => t('Specify a pattern where:') 
+        . theme('item_list', array(t('@ = any letter A-Z'), t('# = any numeral 0-9'), t('| = separates two or more acceptable patterns'), t('Any other character must appear in its exact position')))
+        . t('Examples')
+        . theme('item_list', array(t('North American phone number: (###) ###-####'), t('D-2500 series model numbers: D-25##'), t('UK Postal Code: @# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA'))),
+      ),
+      'description' => t('Verifies that a user-entered value conforms to a specified pattern.'),
+    ),        
   );
 }
 
@@ -511,6 +527,19 @@ function webform_validation_webform_vali
         }
         return $errors;
         break;
+      case "pattern":
+        $pattern = _webform_validation_preg_quote($rule['data'], '/');
+        $pattern = str_replace('@', '[a-zA-Z]', $pattern);
+        $pattern = str_replace('#', '[0-9]', $pattern);
+        $pattern = '(' . $pattern . ')';
+        $pattern = preg_replace('/(\\s*)(\\\\)(\\|)(\\s*)/', ')|(', $pattern); // Un-escape "|" operator
+        foreach ($items as $key => $val) {
+          if ($val != '' && (!preg_match('/^('.$pattern.')$/', $val))) {
+            $errors[$key] = _webform_validation_i18n_error_message($rule);
+          }
+        }
+        return $errors;
+        break;          
     }
   }
 }
