Ios 如何将NSString从一个索引解析到另一个索引?

Ios 如何将NSString从一个索引解析到另一个索引?,ios,nsstring,nsrange,Ios,Nsstring,Nsrange,我想解析如下字符串: NSString*str=@“第一列第二列文本第三列文本” 我有三列文本,每列可以是带空格的文本。 我知道柱子有多宽,col1=10个字符长,col2=20,col3=30 我知道我可以使用NSRange(0,len1)、(10,len2)、(20,len3) 我会出现崩溃“超出范围”错误,因为长度不同,列文本的长度不必达到其最大限制 有什么办法吗 NSString *str = @"A000 B11 This is text description This column

我想解析如下字符串:
NSString*str=@“第一列第二列文本第三列文本”

我有三列文本,每列可以是带空格的文本。
我知道柱子有多宽,col1=10个字符长,col2=20,col3=30
我知道我可以使用NSRange(0,len1)、(10,len2)、(20,len3)

我会出现崩溃“超出范围”错误,因为长度不同,列文本的长度不必达到其最大限制

有什么办法吗

NSString *str = @"A000 B11 This is text description This column is a longer Text description"; 
//A000 column can be 10 chars long
//B11 can be 20 chars
//This is some text description can be 30 characters long
 NSString *code1 = [line substringWithRange:NSMakeRange(0,10)];
 NSString *code2 = [line substringWithRange:NSMakeRange(10,20)];
 NSString *shorttext = [line substringWithRange:NSMakeRange(20,20)];
 NSString *longtext = [line substringWithRange:NSMakeRange(30,30)];
在上面的例子中,我想得到code1=A000,它的长度可以是10个字符,但不必像你所看到的那样。同样,其他两列,code2和文本也是如此。
如何执行此操作?

如果我理解正确,您有一个输入
NSString
str
,它由三个串联字符串组成:
col1
col2
col3
。此外,您知道有关此问题的以下约束条件

  • col1
    介于0到10个字符之间
  • col2
    介于0到20个字符之间
  • col3
    介于0到30个字符之间
并希望从
str
恢复这些字符串。换句话说,您希望唯一地确定
col1
col2
col3
,以便
str
等于

[NSString stringWithFormat:@"%@%@%@", col1, col2, col3];
[NSString stringWithFormat:@"%@ %@ %@ %@", col1, col2, col3, col4];
遗憾的是,正如其他人所评论的那样,没有修改问题是不可能的。
str = @"a";
在这种情况下,您知道其中一个组件字符串(
col1
col2
col3
)等于
@“a”
,而另外两个组件字符串等于
@“
。但是,无法确定是哪个组件字符串。例如,如果
col1=@“a”“
col2
col3
都等于
@”“
;然后

[NSString stringWithFormat:@"%@%@%@", col1, col2, col3]
评估为

@"a"
@"a"
如所愿。但是,如果
col1
col2
等于
@“
col3=@“a”
,则也是如此

[NSString stringWithFormat:@"%@%@%@", col1, col2, col3]
仍然评估为

@"a"
@"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
    的长度介于0到10个字符之间
  • col1
    不包含空格字符
  • col2
    的长度介于0到20个字符之间
  • col2
    不包含空格字符
  • col3
    的长度介于0到30个字符之间
  • col3
    可能包含空格字符
  • col4
    不受长度限制
  • col4
    可能包含空格字符
此外,这四个字符串在串联时用空格分隔。因此,您的目标是唯一地确定
col1
col2
col3
,并且
col4
因此
str
等于

[NSString stringWithFormat:@"%@%@%@", col1, col2, col3];
[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];
此时,可以提取字符串
余数
,其中包含两个由空格分隔的最后字符串
col3
col4

NSCharacterSet *emptyCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@""];
NSString *remainder = nil;
[scanner scanUpToCharactersFromSet:emptyCharacterSet intoString:&remainder];
在这一点上,你又回到了我在一开始描述的那种情况。您有一个字符串(
余数
),它由两个由空格分隔的组件字符串(
col3
col4
)组成。检测这两个字符串之间边界的唯一方法是该空间

但是,
col3
可能包含空格。如果不能,那么您可以简单地扫描,直到到达下一个空格,然后将开头和该空格之间的内容提取到
col3
中,将其余内容提取到
col4


此外,
col4
也可以包含空格。如果不能,那么你可以从
余数
的末尾开始扫描,直到到达从末尾开始的第一个空格,将该范围提取到
col4
中,将其余部分提取到
col3

如果你崩溃了,你能共享代码以便有人可以帮助你吗?所以每次列的长度都不一样吗?在文本列中有空格吗?你没有任何分隔符吗?你所说的只有在最后一列可以是可变长度时才有效。如果前两列可以是可变长度的,那么在每一列之间必须有一些分隔符。希望它能澄清一点。你刚刚确认了问题。前两列不是固定长度,因此不能使用范围。前两列可以吗