如果我理解正確,你具有輸入NSString
str
,其由三個級聯字符串組成:col1
,col2
和col3
。此外,您瞭解這個問題,
col1
是介於0和10個字符
col2
爲0至20個字符
col3
是以下約束 和介於0和30個字符
想要從
str
恢復這些字符串。換句話說,你要
唯一確定
col1
,
col2
和
col3
使
str
等於
[NSString stringWithFormat:@"%@%@%@", col1, col2, col3];
不幸的是,正如其他人評論說,這是不可能的,而無需修改問題。要知道爲什麼不考慮的情況下
str = @"a";
在這種情況下,你就知道該組件串(col1
,col2
,或col3
)的一個等於@"a"
和其他兩個是等於@""
。但是,不可能確定哪個。例如,如果col1 = @"a"
和col2
和col3
都等於@""
;然後根據需要
[NSString stringWithFormat:@"%@%@%@", col1, col2, col3]
評估爲
@"a"
。然而,這也是事實,如果col1
和col2
等於@""
和col3 = @"a"
因爲
[NSString stringWithFormat:@"%@%@%@", col1, col2, col3]
仍計算爲
@"a"
這裏的問題是不是該組件的字符串能夠爲空而是他們能夠在一定範圍內變化。
如果我們限制問題,使得長度爲確切
col1
,這是10個字符長
col2
,這是20個字符長
col3
,這是30個字符長
然後可以用以下函數恢復str
:
void GetColumnsFromString(NSString *str, NSString * __autoreleasing *col1, NSString * __autoreleasing *col2, NSString * __autoreleasing *col3)
{
if (col1) {
*col1 = [str substringWithRange:NSMakeRange(0, 10)];
}
if (col2) {
*col2 = [str substringWithRange:NSMakeRange(10, 20)];
}
if (col3) {
*col3 = [str substringWithRange:NSMakeRange(30, 30)];
}
}
另外,更好,解決方案,已經在評論中提到的,就是用「特」字在str
劃定組件串之間的邊界。如果我們構建str
這樣
str = [NSString stringWithFormat:@"%@%@%@", col1, col2, col3];
和我們限制col1
和col2
和col3
不包含字符
,那麼我們就可以解析col1
和col2
如下:
NSArray *cols = [str componentsSeparatedByString:@""];
col1 = cols[0];
col2 = cols[1];
col3 = cols[2];
的情況如果不使用
字符,則使用空格字符。
編輯:你增加了有關輸入字符串和期望輸出的更多信息:
,而不是三個,有組件串:col1
,col2
,col3
,和col4
。我們有一些關於他們的信息:
col1
長
col1
不包含空格字符
col2
是介於0和10個字符之間0和20長
col2
不包含字符空格字符
col3
長度在0到30個字符之間
col3
MAY包含空格字符
col4
未在長度約束
col4
MAY包含空格字符
此外,四個字符串由空格在他們的級聯分離。所以,你的目標是唯一確定col1
,col2
,col3
,並col4
所以str
等於
[NSString stringWithFormat:@"%@ %@ %@ %@", col1, col2, col3, col4];
您可以使用NSScanner
在這種情況下,提取col1
和col2
:
NSScanner *scanner = [NSScanner scannerWithString:str];
NSCharacterSet *spaceCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@" "];
NSString *col1 = nil, *col2 = nil;
[scanner scanUpToCharactersFromSet:spaceCharacterSet intoString:&col1];
[scanner scanUpToCharactersFromSet:spaceCharacterSet intoString:&col2];
此時,可以提取字符串remainder
,其中包含由最後的兩個字符串col3
和col4
分隔的字符串一個空間:
NSCharacterSet *emptyCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@""];
NSString *remainder = nil;
[scanner scanUpToCharactersFromSet:emptyCharacterSet intoString:&remainder];
在這一點上,你回到了我在開始描述的同樣的情況。您有一個字符串(remainder
),它由兩個由空格分隔的組件字符串(col3
和col4
)組成。檢測這兩個字符串之間邊界的唯一方法就是這個空間。
但是,col3
可能包含空格。如果不能,那麼你可以直接掃描,直到到達下一個空間,並將開始和該空間之間的內容提取到col3
,其餘部分提取到col4
。
另外,col4
也可能包含空格。如果不能,那麼您可以從remainder
的末尾進行掃描,直到到達第一個空格,然後將該範圍提取到col4
,其餘的輸入到col3
。
如果你正在崩潰,你能分享代碼,以便有人可以幫助你嗎? – bryanmac
那麼每一列的長度都不一樣?你在列文本中有空格嗎?你沒有任何分隔符? – calimarkus
你所說的只有在最後一列可變長時纔有效。如果前2列可以是可變長度,那麼每列之間必須有一些分隔符。 – rmaddy