问题同上!
如果以后再考虑到字串之间的关系、或字串是符合某些规则的不确定字符这个问题就比较有趣了!
如果以后再考虑到字串之间的关系、或字串是符合某些规则的不确定字符这个问题就比较有趣了!
解决方案 »
- 请教VB中如何把MSHFlexGrid的记录显示在textbox控件里呢
- 关于VB+ACCESS 查询的问题~~~急死我了 请各位帮帮我~
- 用系统服务来打开程序不显示界面怎么办?急!
- VBA连接oracle数据库问题
- 我有张抓屏想贴上来,该怎么做啊?
- 急急急,為何我這樣寫都會錯,真不明白。請高手們指點
- 哪里有vb6.0和vc6.0中文版下载阿?
- 发传真的问题!我已经试过用MAPI与FaxCom中类发传真都不行.
- 关于mmc控件播放器的几个问题
- VB自带的函数SQRT为什么用不了!!!!!!!!!!!
- 求excel 宏:比较两列同行的两数(有文字),如果不相等,则在同行后面3列的数上插入单元格,直到同行两列相等为止
- 求Acos(x)=dx/l
5447894
8784545ee333eew
325eht663333144548effeaw
....
有1万个,
------------------------------
子串12547
33rfw
3r3hh
789
2346
...
有100个,
-----------------------------
求每次在字符串里首先出现的子串,高效率的写法??
Dim i As Integer
Dim strF As String
Dim str(100) As String
strF = "12346577789054478948784545ee333eew325eht663333144548effeaw "
For i = 0 To 100
If InStr(1, strF, str(i)) > 0 Then
MsgBox str(i)
End If
Next
End Sub
这个意思?
Private Sub Command1_Click()
Dim i As Integer
Dim strF(10000) As String
Dim strS() As String
For i = 0 To 10000'一次循环是必需的
strS = Split(strF(i), ",")'如果每个子字符串是用“,”分隔;如果是空格 Split(strF(i))
Debug.Print strS(0)'不管是100种还是多少种,只取第一个子串
stop
Next
End Sub
字符串2
字符串3 子串1:淮海路
子串2:南京路
子串3:北京路
字符串1查询子串结果为:淮海路
字符串2查询子串结果为:???
----------------------------------------够简单的了,还没去考虑——
子串1:淮海路
子串2:南京路口
子串3:南京路
子串4:北京路
在加几个条件就会极端复杂
Dim strF(10000) As String
Dim str(100) As String
For i = 0 To 9999
For j = 0 To 99
If InStr(1, strF(i), str(j)) > 0 Then
Debug.Print str(j)
Exit For
End If
Next j Next i
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim strF(3) As String '10000缩影
Dim str(6) As String '100缩影
Dim a(3) As Integer '记录子串出现的位置
Dim b(3) As String '记录当前字串
strF(0) = "上海市南京路附近的淮海路"
strF(1) = "南京西路步行街上和平饭店\福州路上上海书城\东方明珠\世纪大道"
strF(2) = "上海图书馆衡山路/成都北路/崂山路"
str(0) = "南京路"
str(1) = "淮海路"
str(2) = "北京路"
str(3) = "福州路"
str(4) = "衡山路"
str(5) = "成都北路"
For i = 0 To 2
a(i) = Len(strF(i))
For j = 0 To 5
If InStr(1, strF(i), str(j)) > 0 And InStr(1, strF(i), str(j)) < a(i) Then
a(i) = InStr(1, strF(i), str(j))
b(i) = str(j)
End If
Next j
Debug.Print b(i)
Next i
End Sub经测试通过,不过我想不出更高效的方法了,Mark
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim strF(3) As String '10000缩影
Dim str(6) As String '100缩影
Dim a(3) As Integer '记录子串出现的位置
Dim b(3) As String '记录当前字串
Dim x As Integer '记录字串出现的位置
Dim strlen(6) As String '记录子串的宽度
strF(0) = "上海市南京路附近的淮海路"
strF(1) = "南京西路步行街上和平饭店\福州路上上海书城\南京路东方明珠\世纪大道"
strF(2) = "上海图书馆衡山路/成都北路/崂山路"
str(0) = "南京路"
str(1) = "淮海路"
str(2) = "北京路"
str(3) = "福州路"
str(4) = "衡山路"
str(5) = "成都北路"
strlen(0) = 3
strlen(1) = 3
strlen(2) = 3
strlen(3) = 3
strlen(4) = 3
strlen(5) = 4
For i = 0 To 2
a(i) = Len(strF(i))
For j = 0 To 5
x = InStr(1, strF(i), str(j))
If x > 0 Then
strF(i) = Left(strF(i), x + strlen(j))
b(i) = str(j)
End If
Next j
x = 0
Debug.Print b(i)
Next i
End Sub应该还有更快的算法,不过老板不给奖金!任务是完成工作,不是完成工作+时间要求,所以再快也是个人兴趣了!
CREATE TABLE T1 (S varchar(200));
INSERT INTO T1 VALUES ('上海市南京路附近的淮海路');
INSERT INTO T1 VALUES ('南京西路步行街上和平饭店\福州路上上海书城\东方明珠\世纪大道');
INSERT INTO T1 VALUES ('上海图书馆衡山路/成都北路/崂山路');CREATE TABLE T2 (S varchar(20));
INSERT INTO T2 VALUES ('南京路');
INSERT INTO T2 VALUES ('淮海路');
INSERT INTO T2 VALUES ('北京路');
INSERT INTO T2 VALUES ('福州路');
INSERT INTO T2 VALUES ('衡山路');
INSERT INTO T2 VALUES ('成都北路');SELECT T1.S S1, T2.S S2, CHARINDEX(T2.S, T1.S) Position
FROM T1, T2
WHERE CHARINDEX(T2.S, T1.S)>0
AND NOT EXISTS(SELECT * FROM T2 TX
WHERE CHARINDEX(TX.S, T1.S)>0
AND CHARINDEX(TX.S, T1.S)<CHARINDEX(T2.S, T1.S)
)
'引用 Microsoft VBScript Regular Expressions 5.5 Dim re As RegExp
Dim s As String
s = "上海市南京路附近的淮海路"
Set re = New RegExp
re.Pattern = "淮海路|北京路|福州路|衡山路|成都北路|南京路"
If re.Test(s) Then
Debug.Print re.Execute(s)(0)
End If'结果: 南京路
Option ExplicitPrivate Sub Command1_Click()
Dim i As Integer, j As Integer
Dim strF(3) As String '10000缩影
Dim str(6) As String '100缩影
Dim strlen(6) As String '记录子串的宽度
Dim MinLen As Integer '子串宽度的最小值
Dim a(3) As Integer '记录子串出现的位置
Dim b(3) As String '记录当前字串
Dim x As Integer '记录字串出现的位置
strF(0) = "上海市南京路附近的淮海路"
strF(1) = "南京西路步行街上和平饭店\福州路上上海书城\南京路东方明珠\世纪大道"
strF(2) = "上海图书馆衡山路/成都北路/崂山路"
str(0) = "南京路"
str(1) = "淮海路"
str(2) = "北京路"
str(3) = "福州路"
str(4) = "衡山路"
str(5) = "成都北路"
MinLen = Len(str(0))
For i = 0 To 5
strlen(i) = Len(str(i))
If strlen(i) < MinLen Then MinLen = strlen(i)
Next i
For i = 0 To 2
a(i) = Len(strF(i))
For j = 0 To 5
x = InStr(1, strF(i), str(j))
If x > 0 And x < a(i) Then '增加 x<a(i) 的判断
a(i) = x
b(i) = str(j)
'如果找到的位置前面的字符数已经小于子串宽度的最小值,则不需要继续查找了
If x < MinLen Then Exit For
'子串中应该不会出现一个是"南京路", 另一个是"南京"这样的情况, 所以这里修改一下
'strF(i) = Left(strF(i), x + strlen(j))
strF(i) = Left(strF(i), x - 1)
End If
Next j
Debug.Print b(i)
Next i
End Sub
看了楼主的代码。最好不要进行字符串的重组。在 VB 中字符串的处理是最慢的。例如这样: Dim p As Integer ...... For i = 0 To 2
a(i) = Len(strF(i))
p = a(i)
For j = 0 To 5
x = InStrRev(strF(i), str(j), p)
If x > 0 Then
p = x + strlen(j) - 2
b(i) = str(j)
End If
Next j
Debug.Print b(i)
Next i
如果内容不多的话 没什么 高效不高效的 再快也快不到哪去 跟排序一个道理
如果内容多 不如考虑
用 Ascii码 或用 Byte数组 字符串可以直接赋值给byte数组
InstrRev("1234567890abcde1234abcde","abcde") =20
在父串中不包含重复子串的情况下是个好方法,好奇的想不知道InstrRev实际是从父串长度-子串长度的位置20开始比完a接着比b,还是逆序从最后e比完接着比d!
--------------------------想起以前碰到的一个分词问题,
示例:山西省太原市中国建设银行
可能查询有:
山西太原市中国建设银行
山西省太原中国建设银行
山西太原建行
不知道百度他们是怎么处理这种问题的,因为当时是有限样本,所以就人工把可能的关键字都写了进去。在有限样本的情况下,怎么考虑分词呢,请教一下?