2017-07-19 61 views
0

我是C#的新手。我在二維條碼中解析了很多數字。該條形碼字符串「+ M727PP011/$$ 3201001A2351S」中隱藏了實際批號「A2351」。我想在單獨的字符串塊中打破此條形碼,但分隔符不一致。解析字符串以獲取特定值

4位數字批號前面的字母前綴可以是'A','P'或'D'可以忽略的批號後面有一個字母。

string Delimiter = "/$$3"; 

//barcode format:M###PP###/$$3 ddmmyy lotnumprefix 'A' followed by lotNum  
string lotNum= "+M727PP011/$$3201001A2351S"; 

string[] split = lotNum.Split(new[] {Delimiter}, StringSplitOptions.None); 

如何在日期後提取批號?

+2

它看起來像(從你的格式註釋)該字符串始終是一致的長度,直到'A',所以爲什麼不從這一點取一個子串? – pstrjds

+0

如果批號始終以A開頭,也許您可​​以查找該批號,然後嘗試並取這些值? – Twtheo

+0

聯繫負責向您發送條形碼的人員,並詢問如何提取批號。 –

回答

0

如果你只是想獲得批號,它確實取決於輸入字符串的格式(它是否是一致的長度,是否有任何可靠的前綴/後綴相對於你試圖解析的數據你可以參考,等等)。它看起來像你的數據可以通過它在字符串中的靜態位置來定義,所以看起來你可以使用substring (索引爲20?)方法來實現你想要的。

1

根據你最初的例子,然後在後面的編輯中你展示了你如何解決這個問題,這聽起來像批號總是在同一個地方。這將是更清潔(更符合標準的C#代碼)使用一個調用string.Substring(int,int),而不是你正在使用的兩條線,也需要拉入VB庫。你只需要撥打Substring並給它起始索引和長度。

所以這個代碼:

string lotNum = Strings.Right(barcode, 6); 
lotNum = lotNum.Remove((lotNum.Length - 1), 1); 

可以用這張單串的調用來做到:

string lotNum = barcode.Substring(barcode.Length - 6, 5); 

編輯
只是進一步說明爲什麼它可能是最好使用調用Substring。在C#string對象是不可變的。這意味着當您撥打Strings.Right時,您將獲得一個新的字符串對象。當你打電話給lotNum.Remove時,你不會從現有的字符串中「移除」一個字符,一個新的字符串會被分配並且字符被刪除並返回給你。所以在你的代碼中,當試圖提取批號時,會有兩個新的字符串分配。當你打電話給Substring時,你會得到一個新的字符串,但是你不需要得到一個新的字符串,而是立即修改並得到第二個新的字符串,你只需要分配一個新的字符串來提取批號。在你給出的例子中,可能沒有任何明顯的性能/內存問題,但是如果這個代碼處於一個緊密的循環中或類似的東西,這可能會導致麻煩。