我有一个简短的测试程序来提取由制表符分隔的字符串。输出对我来说没有意义。我们的想法是找到下一个标签位置,并返回上一个和下一个标签之间的值。
我的程序输出如下。 “抢劫”从何而来?
fred ted rob a rob alex
程序
<cfscript>
s="fred"&chr(9)&"ted"&chr(9)&"rob"&chr(9)&"alex";
oldp=0;
while(oldp<Len(s))
{
p=Find(chr(9),s,oldp+1);
if (p==0)
break;
m=Mid(s,oldp+1,p); // oldp is the old tab poit p is the new get string in between
WriteOutput(m);
WriteOutput(" ");
oldp=p;
}
</cfscript>
现在,如果我更改程序以在每个字符串后打印出oldp
,结果为:
fred => 1
ted rob a => 6
rob alex => 10
我希望看到1,5,9,
。我不明白为什么ted rob
是第二个字符串。我希望看到rob
。
答案 0 :(得分:6)
Mid(s,oldp+1,p);
要回答您的问题,mid的工作原理并非如此。第三个参数p
是要返回的字符数,而不是字符串中的位置。
mid(s, 6, 3) ; // this would return "Ted"
如果我可以提出建议 - 将字符串视为列表更容易,由制表符分隔。然后用列表函数解析它。
<cfscript>
str = "red"& chr(9) &"ted"& chr(9) &"rob"& chr(9) &"alex";
for (i = 1; i <= listLen(str, chr(9)); i++) {
WriteDump( listGetAt(str, i, chr(9)) );
}
</cfscript>
注意,大多数列表函数都忽略空元素。如果您希望保留它们,请使用listToArray。
<cfscript>
str = "red"& chr(9) &"ted"& chr(9) &"rob"& chr(9) &"alex";
arr = listToArray(str, chr(9), true);
for (i = 1; i <= arrayLen(arr); i++) {
WriteDump( arr[i] );
}
</cfscript>