2015-02-09 91 views
3

嘿,我在RegEX所有我很糟糕,所以我發佈這個問題,希望RegEX Guru很容易知道和分享答案。RegEX字符串到特定長度

我有以下字符串類型:

508815 AYBK1619RAUEZP 
AWBZ4222TYBE1207CWSWER 
DEFAULT EP1  O25R60 

而且我需要它在這個格式(分割):

508815 AYBK1619 RAU EZP 
AWBZ4222 TYBE1207 CWS WER 
DEFAULT EP1  O25 R60 

所以: XXXXXXXX XXXXXXXX XXX XXX

  • 字符串中的前8個字符
  • Next 8 c在串haracters
  • 下一頁3點在字符串中的字符
  • 字符串最後3個字符

我可以做MID(X,X)和所有要做到這一點,但我想,使用正則表達式會更快更清潔的代碼。

任何幫助將是偉大的!謝謝!

+0

如果你不能寫正則表達式,那麼它將不會是更乾淨的代碼。堅持你很容易理解的東西,它會在未來避免你頭痛的問題。 – 2015-02-09 18:01:45

+0

@RyanJ檢查更新的OP。 – StealthRT 2015-02-09 18:03:21

+0

我不會使用正則表達式,我會使用子字符串 – pm100 2015-02-09 19:17:40

回答

1

您可以使用下面的正則表達式來得到你所需要的:

^(\w{0,8})\s*(\w+)\s*(\w{3})(\w{3})$ 

此正則表達式將:

  1. 匹配會從字符串開頭的0-8字字符
  2. 其次由0或更多空格組成
  3. 後跟1個或多個字的字符
  4. 跟着0個或多個空格
  5. 通過隨後3個字的字符
  6. 結束字符串

字字符(\w)是任何字母數字字符,加下劃線字符3個字字符

  • 其次。如果嚴格只想比如大寫字母,你可以用一個字符類AZ(在AZ範圍內的任何字母)的替代\w,使用[A-Z]

    See example

  • +0

    檢查我的更新OP ...做了一些可能對RegEX有影響的補充。 – StealthRT 2015-02-09 18:08:26

    +0

    ** ** DEFAULT EP1 O25R60 **我在你的例子中對它進行測試,它告訴我**你的模式與主題字符串不匹配** – StealthRT 2015-02-09 18:13:33

    +0

    @StealthRT查看更新的答案/ example – 2015-02-09 18:14:12

    2

    如果你的願望是實際使用正則表達式來拆分在這些位置,你可以使用以下命令:

    Dim s As String = "508815 AYBK1619RAUEZP" 
    Dim m() As String = Regex.Split(s, "(?<=^.{8})|(?<=^.{16})|(?<=^.{19})") 
    Console.WriteLine(String.Join(" ", m)) '=> "508815 AYBK1619 RAU EZP" 
    

    你也可以只比賽在那些位置,而不是split婷子......

    Dim s As String = "AWBZ4222TYBE1207CWSWER" 
    Dim m As Match = Regex.Match(s, "^(.{8})(.{8})(.{3})(.{3})$") 
    If m.Success Then 
        Console.WriteLine(
          String.Join(" ", 
             m.Groups(1).Value, 
             m.Groups(2).Value, 
             m.Groups(3).Value, 
             m.Groups(4).Value 
            )) 
    End If 
    
    '**Output => "AWBZ4222 TYBE1207 CWS WER" 
    
    +1

    這也是做這件事的另一種方式,所以感謝發佈,以及,HWND! – StealthRT 2015-02-09 18:16:56

    +0

    給你點添加VB.net代碼:) – StealthRT 2015-02-09 19:54:57