使用虚拟字符进行正则表达式社会安全号码验证

Regex Social Security number validation with dummy characters

我正在修改显示 SS# 的现有代码。尽管我对正则表达式几乎一无所知,但我正在尝试找出现有的验证。我需要做的是将现有的验证重构为 ALSO 接受前 5 个位置的虚拟字符(可能是大写 "X"),仅有效显示最后 4 个。所有这些 w/o 搞乱了现有的验证。我传递给控件的内容将取决于应用程序中的角色,可以是完整数字 000000000 或 XXXXX0000。任何建议将不胜感激。

<dx:ASPxTextBox ID="SSN" runat="server" CssClass="ContractTextEntry" 
            MaxLength="9" Width="145px" AutoPostBack="True" 
  ValidationSettings-RegularExpression-ValidationExpression="^(?!000)(?!666)(?!9)\d{3}([- ]?)(?!00)\d{2}(?!0000)\d{4}$">
   <MaskSettings Mask="000-00-0000" PromptChar=" " />
   <ValidationSettings SetFocusOnError="True">
     <RegularExpression ErrorText="Please enter a valid SSN" />
   </ValidationSettings>
 </dx:ASPxTextBox>

如果您只想接受 X 以及前 5 个数字中的一个数字,那么这是一个相当简单的修改:

^(?!000)(?!666)(?!9)[X0-9]{3}([- ]?)(?!00)[X0-9]{2}(?!0000)\d{4}$

我所做的就是用 [X0-9](表示 X 或 0-9 范围内的字符)

仅供参考 - 第一个后面的 {3} 表示重复 3 次(第二个实例上的 {2} 表示重复 2 次)

由于您需要一些东西,所以前 5 个都是 X,或者它们都是数字。
我认为 Dot-Net 支持条件,但不确定组号是否匹配。
我知道它支持有条件的组名。

 #  ^(?!000)(?!666)(?!9)(?:(XXX)|\d{3})([- ]?)(?!00)(?(1)XX|\d{2})(?!0000)\d{4}$

 ^ 
 (?! 000 )
 (?! 666 )
 (?! 9 )
 (?:
      ( XXX )          # (1), XXX
   |  \d{3}            # Or digits
 )
 ( [- ]? )             # (2), Separator
 (?! 00 )
 (?(1)                 # Conditional, did group 1 match ?
      XX               # yes, get  XX
   |  \d{2}            # no, get digits
 )
                     # Backref to separator
 (?! 0000 )
 \d{4} 
 $