RegEx根据字符串长度匹配不同的子字符串

时间:2012-08-10 03:47:24

标签: c# regex

我正在寻找一个匹配字母数字字符串的正则表达式。如果字符串长度为32个字符,则匹配字符17到28.如果字符串长度为34个字符,则匹配最后12个字符。

RegEx Match Conditions http://s12.postimage.org/ghathiz2l/Screen_shot_2012_08_09_at_11_52_22_PM.png

我有两个单独的表达式来获得两种不同条件的匹配。

.(?<match>[0-9]{16}) and .(?<match>[0-9]{12})

在代码中,我从右到左阅读表达式,处理'if'并截断匹配的最后4个字符,原始字符串长度为32个字符,但希望能够从单个RegEx执行此操作

修改

在这种情况下,我确实更愿意取消RegEx,但我不是该应用程序的原作者。字符串解析条件可能会随着时间的推移而发生变化,因此在配置文件中维护RegEx比在此实例中创建新版本更简单。而且,这是老板想要的......

1 个答案:

答案 0 :(得分:5)

试试这个:

^(.{22}(.{12}))|(.{16}(.{12}).{4})$

$1是第一个案例的完整匹配(34个字符长); $2是匹配的12个字符。

$3是第二种情况的完整匹配(32个字符长); $4是匹配的12个字符。

容易!

另一种,也可以说更简单的方法是查看入站字符串并根据字符串长度分配正确的正则表达式实例:

private static Regex rx34 =  ... ;
private static Regex rx32 = ... ;
string foo( string s )
{
  Regex rx ;

  switch ( s.Length )
  {
  case 34 : rx = rx34 ; break ;
  case 32 : rx = rx32 ; break ;
  default : throw new ArgumentOutOfRangeException("s") ;
  }
  Match m = rx.Match(s) ;
  if ( !m.Success ) throw new InvalidOperationException() ;

  ... // return the appropriate part of the string.

}

或者,为什么要使用正则表达式?这对正则表达式来说不是问题。

string foo( string s )
{
  string s12 ;
  switch (( s ?? "" ).Length)
  {
  case 34 : return s12 = s.Substring( 34 - 12 ) ;
  case 32 : return s12 = s.Substring( 16 , 12 ) ;
  default : throw new ArgumentOutOfRangeException("s");
  }
  return s12 ;
}

因为生活太难以使事情变得更加艰难。