private static List<String> tokenize(String bencodedString) throws DecoderException {
		List<String> tokenList = new ArrayList<String>();
		Matcher m = DECODE_PATTERN.matcher(bencodedString);
		while(m.find()) {
			String extractedToken = bencodedString.substring(m.start(), m.end());
			if(extractedToken.equals(BencodingToken.START_TOKEN)) {
				m.find();
				tokenList.add(BencodingToken.START_TOKEN);
				tokenList.add(bencodedString.substring(m.start(), m.end()));
				m.find();
				if(!bencodedString.substring(m.start(), m.end()).equals(BencodingToken.END_TOKEN)) {
					throw new DecoderException();
				}
			}
			
			if(extractedToken.contains(BencodingToken.COLON_TOKEN)) {
				int stringLength = Integer.parseInt(extractedToken.substring(0, extractedToken.length()-1));
				String stringToken = bencodedString.substring(m.end(), m.end() + stringLength);
				tokenList.add(BencodingToken.STRING_TOKEN);
				tokenList.add(stringToken);
				m = m.region(m.end()+stringLength, bencodedString.length());
			}
			
			if(extractedToken.equals(BencodingToken.START_LIST_TOKEN)) {
				tokenList.add(BencodingToken.START_LIST_TOKEN);
			}
			
			if(extractedToken.equals(BencodingToken.START_DICT_TOKEN)) {
				tokenList.add(BencodingToken.START_DICT_TOKEN);
			}
			
			if(extractedToken.equals(BencodingToken.END_TOKEN)) {
				tokenList.add(BencodingToken.END_TOKEN);
			}
			
		}
		return tokenList;
	}