1

英数字の文字列に一致する正規表現を探しています。文字列の長さが 32 文字の場合は、文字 17 ~ 28 と一致します。文字列の長さが 34 文字の場合は、最後の 12 文字と一致します。

正規表現一致条件 http://s12.postimage.org/ghathiz2l/Screen_shot_2012_08_09_at_11_52_22_PM.png

2 つの異なる条件に一致する 2 つの異なる式があります。

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

コードでは、式を右から左に読み取り、「if」を処理し、元の文字列が 32 文字の長さの場合に一致の最後の 4 文字を切り捨てますが、単一の RegEx からこれを実行できるようにしたいと考えています。

編集

この場合、正規表現を廃止したいと思いますが、私はアプリの元の作成者ではありません。文字列解析条件は時間の経過とともに変化する可能性があるため、このインスタンスで新しいリリースを作成するよりも、構成ファイルで RegEx を維持する方が簡単です。しかも、それが上司の望み…

4

1 に答える 1

5

これを試して:

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

$1最初のケース (34 文字の長さ) の完全な一致です。$2一致した 12 文字です。

$32 番目のケース (32 文字の長さ) の完全な一致です。$4一致した 12 文字です。

簡単!

もう 1 つの、おそらくより簡単な方法は、着信文字列を調べて、文字列の長さに基づいて正しい正規表現インスタンスを割り当てることです。

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 ;
}

人生は難しすぎて、物事を実際よりも難しくすることはできないからです。

于 2012-08-10T03:54:07.677 に答える