簡體   English   中英

RegEx根據字符串長度匹配不同的子字符串

[英]RegEx to match different substrings based on string length

我正在尋找一個正則表達式來匹配字母數字字符串。 如果字符串長度為32個字符,則匹配字符17至28。如果字符串長度為34個字符,則匹配最后12個字符。

RegEx匹配條件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”,並在原始字符串長32個字符時截斷了匹配的最后4個字符,但希望能夠通過一個RegEx做到這一點。

編輯

在這種情況下,我確實希望取消RegEx,但我不是該應用程序的原始作者。 字符串解析條件可能會隨時間變化,因此在這種情況下,在配置文件中維護RegEx比創建新版本要容易得多。 另外,這就是老板想要的...

嘗試這個:

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

$1是第一種情況的完整匹配項(長34個字符); $2是匹配的12個字符。

$3是第二種情況的全部匹配項(長度為32個字符); $4是匹配的12個字符。

簡單!

另一種方法(可能更簡單)是查看入站字符串並根據字符串長度分配正確的regex實例:

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

因為生活太困難了,所以事情變得比實際困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM