dycadrtf 发表于 2008-8-24 14:08:43

谢谢

:victory: :victory: :victory: :victory:

[ 本帖最后由 dycadrtf 于 2008-8-28 08:55 编辑 ]

dreamever 发表于 2008-8-24 18:13:58

例子2
something
这个字符串有个两个label:
a
b
按照你的说明,这里面怎会有两个label?

dreamever 发表于 2008-8-24 18:14:40

好象我不能回帖了?

小孩 发表于 2008-8-25 09:17:49

实在不知道你要啥

hsjzfling 发表于 2008-8-25 10:17:01

貌似不难,就是做一些字符串的处理,考察点大概就在对于各种可能情况的处理,嗯,再加上异常处理。

dycadrtf 发表于 2008-8-25 10:20:31

出鬼了,我例子明明写的是
例子2
something
这个字符串有个两个label:
a
b

怎么显示的不对呢?
哪去了啊?

dycadrtf 发表于 2008-8-25 10:20:44

靠,还是没显示出来

dycadrtf 发表于 2008-8-26 09:28:49

额,没人帮个忙吗?

zte_boy 发表于 2008-8-26 10:28:12

是否可能出现嵌套的情况,如:1c5] 的情况?

[ 本帖最后由 zte_boy 于 2008-8-26 10:29 编辑 ]

dycadrtf 发表于 2008-8-26 14:31:07

原帖由 zte_boy 于 2008-8-26 10:28 发表 http://bbs.51testing.com/images/common/back.gif
是否可能出现嵌套的情况,如: 的情况?

不用考虑的,就假设输入的都是没有嵌套的情况

没有蛀牙 发表于 2008-8-26 15:41:43

看不懂你的例子

hsjzfling 发表于 2008-8-26 20:27:05

原帖由 dycadrtf 于 2008-8-24 14:08 发表 http://bbs.51testing.com/images/common/back.gif
分析一个字符串,分析出字符串中的label情况,被"[]" 包围的字符串就是一个label,一个"[]"中可能包含多个label,以"," 或者 " "(空格)分隔,
如果label是用引号包含的则忽略其中的空格。
例子说明
lable是一个字 ...

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

Sub RemoveEngSquareBrackets(ByRef strng)
Dim sInd, eInd, subStrng
sInd = InStr(strng, "[")
If sInd = 0 Then
Exit Sub
Else
eInd = InStr(sInd+1, strng, "]")
subStrng = Mid(strng, sInd+1, eInd-sInd-1)
strng = Left(strng, sInd - 1) & Right(strng, Len(strng) - eInd)
Call RemoveQuotationMarks(subStrng)
End If
Call RemoveEngSquareBrackets(strng)
End Sub

Sub RemoveChnSquareBrackets(ByRef strng)
strng = Replace(strng, "【", " ")
strng = Replace(strng, "】", " ")
End Sub

Sub RemoveQuotationMarks(ByRef strng)
Dim sInd, eInd
sInd = InStr(strng, Chr(34))
If sInd = 0 Then
Call GetSingleLabel(strng)
Exit Sub
Else
eInd = InStr(sInd+1, strng, Chr(34))
arrLabel(iLabel) = Mid(strng, sInd+1, eInd-sInd-1)
iLabel = iLabel + 1
strng = Left(strng, sInd - 1) & Right(strng, Len(strng) - eInd)
Call RemoveQuotationMarks(strng)
End If
End Sub

Sub GetSingleLabel(strng)
Dim arrSplitbySpace, arrSplitByComma, i, j
arrSplitbySpace = Split(strng, " ")
For i = 0 To UBound(arrSplitbySpace)
arrSplitByComma = Split(arrSplitbySpace(i), ",")
For j = 0 To UBound(arrSplitbyComma)
   If arrSplitByComma(j) <> "" Then
    arrLabel(iLabel) = arrSplitByComma(j)
    iLabel = iLabel + 1
   End If
Next
Next
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:32

原帖由 没有蛀牙 于 2008-8-26 15:41 发表 http://bbs.51testing.com/images/common/back.gif
看不懂你的例子

有这么难看懂吗?

hsjzfling 发表于 2008-8-27 11:01:56

我修改了下在12楼的代码,并补充了点思路~
页: [1]
查看完整版本: 谢谢