51Testing软件测试论坛

标题: 谢谢 [打印本页]

作者: dycadrtf    时间: 2008-8-24 14:08
标题: 谢谢


[ 本帖最后由 dycadrtf 于 2008-8-28 08:55 编辑 ]
作者: dreamever    时间: 2008-8-24 18:13
例子2
[a]something
这个字符串有个两个label:
a
b
按照你的说明,这里面怎会有两个label?
作者: dreamever    时间: 2008-8-24 18:14
好象我不能回帖了?
作者: 小孩    时间: 2008-8-25 09:17
实在不知道你要啥
作者: hsjzfling    时间: 2008-8-25 10:17
貌似不难,就是做一些字符串的处理,考察点大概就在对于各种可能情况的处理,嗯,再加上异常处理。
作者: dycadrtf    时间: 2008-8-25 10:20
出鬼了,我例子明明写的是
例子2
[a]something
这个字符串有个两个label:
a
b

怎么显示的不对呢?
哪去了啊?
作者: dycadrtf    时间: 2008-8-25 10:20
靠,还是没显示出来
作者: dycadrtf    时间: 2008-8-26 09:28
额,没人帮个忙吗?
作者: zte_boy    时间: 2008-8-26 10:28
是否可能出现嵌套的情况,如:[a 2[b6]1c5] 的情况?

[ 本帖最后由 zte_boy 于 2008-8-26 10:29 编辑 ]
作者: dycadrtf    时间: 2008-8-26 14:31
原帖由 zte_boy 于 2008-8-26 10:28 发表
是否可能出现嵌套的情况,如:[a 21c5] 的情况?


不用考虑的,就假设输入的都是没有嵌套的情况
作者: 没有蛀牙    时间: 2008-8-26 15:41
看不懂你的例子
作者: hsjzfling    时间: 2008-8-26 20:27
原帖由 dycadrtf 于 2008-8-24 14:08 发表
分析一个字符串,分析出字符串中的label情况,被"[]" 包围的字符串就是一个label,一个"[]"中可能包含多个label,以"," 或者 " "(空格)分隔,
如果label是用引号包含的则忽略其中的空格。
例子说明
lable是一个字 ...


写了个例子,lz有需要自己再封装一下好了
  1. Dim arrLabel(1000), iCount, iLabel:iLabel=0
  2. str="[kk]【""aa, ab""】[""b bb"" cd]【cc,dd efg】"
  3. Call RemoveChnSquareBrackets(str)
  4. Call RemoveEngSquareBrackets(str)
  5. Call RemoveQuotationMarks(str)
  6. For iCount = 0 To iLabel-1
  7. WScript.Echo arrLabel(iCount)
  8. Next

  9. Sub RemoveEngSquareBrackets(ByRef strng)
  10. Dim sInd, eInd, subStrng
  11. sInd = InStr(strng, "[")
  12. If sInd = 0 Then
  13.   Exit Sub
  14. Else
  15.   eInd = InStr(sInd+1, strng, "]")
  16.   subStrng = Mid(strng, sInd+1, eInd-sInd-1)
  17.   strng = Left(strng, sInd - 1) & Right(strng, Len(strng) - eInd)
  18.   Call RemoveQuotationMarks(subStrng)  
  19. End If
  20. Call RemoveEngSquareBrackets(strng)
  21. End Sub

  22. Sub RemoveChnSquareBrackets(ByRef strng)
  23. strng = Replace(strng, "【", " ")
  24. strng = Replace(strng, "】", " ")
  25. End Sub

  26. Sub RemoveQuotationMarks(ByRef strng)
  27. Dim sInd, eInd
  28. sInd = InStr(strng, Chr(34))
  29. If sInd = 0 Then
  30.   Call GetSingleLabel(strng)
  31.   Exit Sub
  32. Else
  33.   eInd = InStr(sInd+1, strng, Chr(34))
  34.   arrLabel(iLabel) = Mid(strng, sInd+1, eInd-sInd-1)
  35.   iLabel = iLabel + 1
  36.   strng = Left(strng, sInd - 1) & Right(strng, Len(strng) - eInd)
  37.   Call RemoveQuotationMarks(strng)
  38. End If
  39. End Sub

  40. Sub GetSingleLabel(strng)
  41. Dim arrSplitbySpace, arrSplitByComma, i, j
  42. arrSplitbySpace = Split(strng, " ")
  43. For i = 0 To UBound(arrSplitbySpace)
  44.   arrSplitByComma = Split(arrSplitbySpace(i), ",")
  45.   For j = 0 To UBound(arrSplitbyComma)
  46.    If arrSplitByComma(j) <> "" Then
  47.     arrLabel(iLabel) = arrSplitByComma(j)
  48.     iLabel = iLabel + 1
  49.    End If
  50.   Next
  51. Next
  52. End Sub
复制代码
昨晚朋友催的急,代码只是简单的调试了下,早上来看了看才发现调试的是中间过程,最终的输入都还没改回来~~
代码我得再稍微改改~~
改完了,顺便简单提下思路咯

这道题难点其实就在于各种存在的情况相对较多,将之逐一消除掉就好了
1. 在不考虑[]嵌套的情况下,将【】直接替换为空格即可,然后循环将每对[]中的子字符串找出来,本例中是用的此逻辑;
    若要考虑嵌套,则第1步就要改为:分别搜索第1个"]"和"】",取position值小的那个eInd,再搜索与之匹配的position最大但是小于eInd的sInd,则sInd与eInd之间的就是第一个子字符串,然后删除掉该对中括号及子字符串,递归调用以逐一找出所有配对的中括号及子字符串。
2. 再看子字符串中有没""存在,有的话就直接将每对""中的值存入arrLabel数组中,并删除掉该""及其中内容;
3. 再看子字符串中剩下的还有几个label,分别以" "和","来split,得到不为空的值就都是label

[ 本帖最后由 hsjzfling 于 2008-8-27 11:00 编辑 ]
作者: dycadrtf    时间: 2008-8-27 09:00
原帖由 没有蛀牙 于 2008-8-26 15:41 发表
看不懂你的例子


有这么难看懂吗?
作者: hsjzfling    时间: 2008-8-27 11:01
我修改了下在12楼的代码,并补充了点思路~




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2