如何更改我的正则表达式

时间:2016-08-09 14:18:43

标签: c# .net regex

我有一个正则表达式:

string DefaultInternalUseridPattern = "^(?i)((CEU)|(APA)|(NAM))\\\\(((ADM.){0,1}([a-z]{8}))|((SVC.){0,1}((CEU.)|(APA.)|(NAM.)|(HEI.))[a-z]*))$";

我想替换最后一部分: (CEU)|(APA)|(NAM)|(HEI)

使用与3 Letter相匹配的内容,然后使用.

我尝试了一些东西,但没有得到我的问题的解决方案。

2 个答案:

答案 0 :(得分:3)

您的表达式因捕获组而过载,我怀疑您是否正在使用它们并建议删除那些多余的表达式。这将简化任何进一步的操作。

请注意,必须转义模式中的文字点。

我也看到你正在使用常规字符串文字,而逐字字符串文字在C#中定义正则表达式模式要舒服得多。

尝试

@"^(?i)(CEU|APA|NAM)\\((ADM\.)?([a-z]{8})|(SVC\.)?([A-Z]{3}\.)[a-z]*)$"
                                                   ^^^^^^^^^^ 

请参阅demo here,我将4个备用组更改为[A-Z]{3}\.

请注意,如果您只需要匹配大写字母,则需要在(?-i:[A-Z]{3}\.)组中使用它们。

答案 1 :(得分:0)

您可以摆脱所有不需要的捕获组并使用此

原始:^(?i)(?:CEU|APA|NAM)\\(?:(?:ADM\.)?[a-z]{8}|(?:SVC\.)?[A-Z]{3}\.[a-z]*)$
逐字:@"^(?i)(?:CEU|APA|NAM)\\(?:(?:ADM\.)?[a-z]{8}|(?:SVC\.)?[A-Z]{3}\.[a-z]*)$"

扩展

 ^ 
 (?i)                      # Be careful here, this says case insensitive
                           # for all subsequent letter matching.
 (?: CEU | APA | NAM )
 \\ 
 (?:
      (?: ADM \. )?
      [a-z]{8} 
   |  
      (?: SVC \. )?
      [A-Z]{3} \.
      [a-z]* 
 )
 $