2016-01-10 17 views
-1

我有串是這樣的:如何使用子字符串時字符串的長度是不固定的,每次

SKU: XP321654 
Quantity: 1 
Order date: 01/08/2016 

SKU長度是不固定的,所以我的函數的某個時候返回我數量也的第一個或兩個字符這我不想得到。我只想獲得SKU價值。

我的代碼:

int index = Content.indexOf("SKU:"); 
String SKU = Content.substring(index, index+15); 

如果SKU有一個或兩個以上的數字,然後又是不能夠得到,因爲我已經指定的限制,直到15。如果我做index + 16以獲得長的SKU數據,那麼對於Short SKU,它還會返回一些數量的字符。

我該如何解決它。有什麼方法可以用來代替靜態字符串字符長度作爲限制。

我的SKU最後一位數字總是會編號,所以我可以使用的任何其他東西只能得到SKU,直到它是最後一位數字?

+1

您可以使用正則表達式而不是substring ... – Idos

+0

@Idos - 我試過但沒有獲得我想要的格式的數據。你能幫忙嗎? –

+0

或者你可以找到'SKU'和'Quantity'的索引,那麼這些字符串之間的字符串是必需的字符串SKU編號 –

回答

2

使用.substring根本就不是處理這種事情的方式。你需要的是一個正則表達式(或正則表達式):

Pattern pat = Pattern.compile("SKU\\s*:\\s*(\\S+)"); 
String sku = null; 

Matcher matcher = pattern.matcher(Content); 
if(matcher.find()) { //we've found a match 
    sku = matcher.group(1); 
} 
//do something with sku 

轉義的正則表達式是一樣的東西:

SKU\s*:\s*(\S+) 

你因此尋找與SKU再其次是從零開始的模式或更多\s(間距字符,如空格和製表符),後跟一個冒號(:),然後可能爲零個或多個空格字符(\s),最後是您感興趣的部分:一個或多個(這就是的含義)非空格字符(\S)。通過將這些放在括號中,這些是匹配組。如果正則表達式成功找到該模式(matcher.find()),則可以提取匹配組matcher.group(1)的內容並將其存儲到字符串中。

潛在您可以提高正則表達式進一步如果你比如更多地瞭解一個SKU的樣子。舉例來說,如果它僅包括了大寫字母和數字,你可以通過[0-9A-Z]代替\S,所以後來的格局變爲:

Pattern pat = Pattern.compile("SKU\\s*:\\s*([0-9A-Z]+)"); 

編輯:對於量數據,可以使用:

Pattern pat2 = Pattern.compile("Quantity\\s*:\\s*(\\d+)"); 
int qt = -1; 

Matcher matcher = pat2.matcher(Content); 
if(matcher.find()) { //we've found a match 
    qt = Integer.parseInt(matcher.group(1)); 
} 

或參見this jdoodle

+0

如果他只是需要得到冒號的正確部分 – Dici

+0

@Dici,我會說這是矯枉過正的:記住後來的項目順序可以更改,或者有關SKU外觀的具體規則等,通過使用模式,您更有信心找到正確的項目。 –

+1

我有一個理念,你不應該設計你認爲你將來可能擁有的要求,而是你現在的要求。這導致更簡單的系統和更快的開發。他實際上可能永遠不需要比'substring'更多的東西。去最簡單!無論如何,他會決定對他來說最好的是什麼 – Dici

1

你知道你可以只參考字符串的長度嗎?

String s = "SKU: XP321654"; 
String sku = s.substring(4, s.length()).trim(); 

我認爲在這種情況下使用正則表達式顯然是矯枉過正的,它比這更簡單。你甚至可以拆分表達式,雖然它比上面的解決方案效率低一些,但請不要使用正則表達式!

String sku = "SKU: XP321654".split(':')[1].trim(); 
+0

但是你還需要從問題中提供的3行字符串中獲得's'字符串。這是不完整的。 – user1803551

+0

通常你會逐行閱讀一個文件,我認爲在第一個格式中使用這種格式的字符串並不合適 – Dici

+0

這就是爲什麼我在跳轉到答案前在評論中詢問OP的原因,事實證明,輸入是帶有換行符的單個字符串。 – user1803551

0

1:你有由線分裂的輸入(或由\ n個分割)

2:當你有你行:你搜索:然後你走線的剩餘的(在Dici答案中提到的字符串大小)。

0

根據串究竟包含了新的線路,你可以這樣做:

public static void main(String[] args) { 

    String s = "SKU: XP321654\r\n" + 
       "Quantity: 1\r\n" + 
       "Order date: 01/08/2016"; 

    System.out.println(s.substring(s.indexOf(": ") + 2, s.indexOf("\r\n"))); 
} 

只是注意,這1班輪有幾個限制:

  • SKU酒店是第一。如果不是,則適當修改啓動索引以搜索"SKU: "
  • 新行可能會分開,否則\R是所有有效的新行換碼字符組合的正則表達式。
相關問題