vb 如何拆分这样的字符串!!!

abc818 2009-11-11 10:58:37
有这样的字符串str1:A(1),B(2),C(3)拆分成str2:A,B,C和str3:1,2,3两个字符串,更重要的是str1输入获取的,并不是固定的,也可能是A(1),B(2)或者D(12),拆分成类似str2和str3的样式。怎么做呢?请高手们指点,急用啊!!!
...全文
580 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lmhcs 2009-11-12
  • 打赏
  • 举报
回复
楼主说的不是很清楚。或者是我自己理解得不是很清楚

如果str1的格式就是一个字母类型的值,然后括号数字的值,然后再以逗号分隔的话可以

Private Sub splitStr(ByVal Str1$, ByRef str2$, ByRef str3$)
Dim arrS() As String
Dim s1, s2 As New System.Text.StringBuilder
Dim n As Integer
arrS = Split(Str1, ",")
For i As Integer = 0 To arrS.Length - 1
n = arrS(i).IndexOf("(")
s1.Append(arrS(i).Substring(0, n) & ",")
s2.Append(arrS(i).Substring(n + 1, Len(arrS(i)) - n - 2) & ",")
Next
str2 = s1.Remove(s1.Length - 1, 1).ToString
str3 = s2.Remove(s2.Length - 1, 1).ToString
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim s1, s2, s3 As String
s1 = "A(1),B(2),C(3)"
splitStr(s1, s2, s3)
Console.WriteLine(s2)
Console.WriteLine(s3)
End Sub


输出:
A,B,C
1,2,3
abc818 2009-11-12
  • 打赏
  • 举报
回复
谢谢上面各位大师,的确要自己领会
abc818 2009-11-12
  • 打赏
  • 举报
回复
谢谢上面两位大师的指教,我都试了一下,1楼大师中的代码要把i < str1.Length改成i < str1.Length-1,才不会出现错误;2楼大师中的代码要把s1.Append(arrS(i).Substring(0, n) & ",")改成s1.Append(arrS(i).Substring(0, n - 1) & ",")才会出现我想我的结果。谢谢你们的赐教!
Bill_Anny 2009-11-12
  • 打赏
  • 举报
回复
Module Module1
Private flg As Char = ","c
Private flg1 As Char = "("c
Private flg2 As Char = ")"c

Sub Main()
Dim str1 As String = "A(1),B(2),C(3)"
Dim str2 As String = "A,B,C"
Dim str3 As String = "1,2,3"

If Not strSplit(str1, str2, str3) Then
Console.WriteLine("Data Error!!")
Console.ReadKey()
End If

End Sub

Public Function strSplit(ByVal str1 As String, ByRef ret1 As String, ByRef ret2 As String) As Boolean
Dim strArTemp As String()
Dim sRet1 As String = ""
Dim sRet2 As String = ""
Dim sTmp1 As String = ""
Dim sTmp2 As String = ""

strArTemp = str1.Split(flg)

For i As Integer = 0 To UBound(strArTemp)
If Not getNum(strArTemp(i), sTmp1, sTmp2) Then
Return False
End If

sRet1 &= sTmp1
sRet2 &= sTmp2
If i <> UBound(strArTemp) Then
sRet1 = sRet1 & ","
sRet2 = sRet2 & ","
End If
Next i

Console.WriteLine(sRet1)
Console.WriteLine(sRet2)

Console.ReadKey()
End Function

Private Function getNum(ByVal str As String, ByRef ret1 As String, ByRef ret2 As String) As Boolean
Dim iStart As Integer
Dim iEnd As Integer

iStart = str.IndexOf(flg1)
iEnd = str.IndexOf(flg2)

If iStart = -1 OrElse iEnd = -1 Then
Return False
End If

ret1 = str.Substring(0, iStart)
ret2 = str.Substring(iStart + 1, iEnd - 2)
Return True
End Function

End Module
yuzhlhua 2009-11-12
  • 打赏
  • 举报
回复
楼上各位方法都不错,楼主还是领会思路吧。

实现还是自己动手吧。
yanlongwuhui 2009-11-12
  • 打赏
  • 举报
回复
括号外只有字母,内只有数,5楼的方法挺好
清晨曦月 元老 2009-11-12
  • 打赏
  • 举报
回复
何不用正则表达式呢。。。。写了一块代码。
只需要,
1、保留A-Z,0-9,逗号
2、剔除数字
3、剔除字母

Sub CleanInput(ByVal Input As String, ByRef Out1 As String, ByRef Out2 As String)
'清理全部非数字和字母字符串,但保留,,
'若需要将,替换则在后面加.Replace(",", ",")
Dim TmpStr As String = System.Text.RegularExpressions.Regex.Replace(Input, "[^\w\,,]", "")
'替换数字
Out1 = System.Text.RegularExpressions.Regex.Replace(TmpStr, "[0-9]", "")
'替换字母
Out2 = System.Text.RegularExpressions.Regex.Replace(TmpStr, "[A-Z]", "")
End Sub
测试了一下,速度还是蛮快的。。。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
‘str1初始化为1000个"A(1),B(2),C(3),D(12),"
Dim str1 As String = Space(1000).Replace(" ", ("A(1),B(2),C(3),D(12),"))
Dim str2 As String = String.Empty
Dim str3 As String = String.Empty
’开始计时
Dim t As Integer = My.Computer.Clock.TickCount
’替换函数
CleanInput(str1, str2, str3)
‘函数运算完成,输出用时
MsgBox(My.Computer.Clock.TickCount - t)
‘替换结果输出
Debug.Print(str2 & vbCrLf & str3)
End Sub
CloneCenter 2009-11-12
  • 打赏
  • 举报
回复
使用 String.Split 方法提取出单个元素,找出左括号"("和右括号")"的位置,提取前后的字符串即可。
vb6andvc6 2009-11-12
  • 打赏
  • 举报
回复
(1)
dim kw() as string
kw=split(str1,",")

(2)
dim kp() as string
kp=split(kw(0),"("))

以后你自已写出吧
清晨曦月 元老 2009-11-12
  • 打赏
  • 举报
回复
虽然结贴了,我还得看看。。哈哈,有的同志的代码确实有问题。例如运行D(12),另外楼主打代码的时候,我发现用了中文括号和英文括号。。。。虽然在这里显式一样,可复制到IDE是不同的。。。。综合考虑这些情况楼主没有详细说明,所以采用了折中的方式。。
lmhcs 2009-11-12
  • 打赏
  • 举报
回复
呵呵,刚才看了5楼的说法,特地test下,发现我的函数还是蛮快的,比5楼的正则还要快,哈哈.我的代码在我的电脑上开始几次运行的时间是16,16,然后几次15,在然后就0了.5楼的保持在16或者15之间
 Sub CleanInput(ByVal Input As String, ByRef Out1 As String, ByRef Out2 As String)
'清理全部非数字和字母字符串,但保留,,
'若需要将,替换则在后面加.Replace(",", ",")
Dim TmpStr As String = System.Text.RegularExpressions.Regex.Replace(Input, "[^\w\,,]", "")
'替换数字
Out1 = System.Text.RegularExpressions.Regex.Replace(TmpStr, "[0-9]", "")
'替换字母
Out2 = System.Text.RegularExpressions.Regex.Replace(TmpStr, "[A-Z]", "")
End Sub
Private Sub splitStr(ByVal Str1$, ByRef str2$, ByRef str3$)
Dim arrS() As String
Dim s1, s2 As New System.Text.StringBuilder
Dim n As Integer

arrS = Split(Str1, ",")
For i As Integer = 0 To arrS.Length - 1
n = arrS(i).IndexOf("(")
s1.Append(arrS(i).Substring(0, n) & ",")
s2.Append(arrS(i).Substring(n + 1, Len(arrS(i)) - n - 2) & ",")
Next
str2 = s1.Remove(s1.Length - 1, 1).ToString
str3 = s2.Remove(s2.Length - 1, 1).ToString
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim s1, s2, s3 As String
s1 = Space(1000).Replace(" ", "A(1),B(2),C(3),")
s1 = s1.Remove(s1.Length - 1, 1)
Dim t As Integer = My.Computer.Clock.TickCount
'CleanInput(s1, s2, s3)
splitStr(s1, s2, s3)
Console.WriteLine("计算1000个花费时间:" & My.Computer.Clock.TickCount - t)
Console.WriteLine("输出str2:" & s2)
Console.WriteLine("输出str3:" & s3)

End Sub

平时没有搞测试效率这玩意儿,上面的方法有失误的话请指正:)

另外 9楼说要的代码要修改,不知道楼主要获得什么样子的结果,我按你的修改话str2返回逗号而以。下面的图片是我程序运行的结果
ljhcy99 2009-11-11
  • 打赏
  • 举报
回复
C#写的,你修改下吧
static void Main(string[] args)
{
string str1 = "A(1),B(2),C(3),D(12)";
StringBuilder s1 = new StringBuilder();
int index = -1;
char c;
StringBuilder s2 = new StringBuilder();
for (int i = 0; i < str1.Length;i++ )
{
c = str1[i];
if (Char.IsLetter(c))
{
s1.Append(c);
s1.Append(",");

}
if (c == '(')
{
index = str1.IndexOf(")",i);
s2.Append(str1.Substring(i+1,index-i-1));
s2.Append(",");

}

}
string str2 = s1.ToString().Substring(0,s1.Length-1);
string str3 = s2.ToString().Substring(0, s2.Length - 1);
Console.WriteLine(str2);
Console.WriteLine(str3);

Console.ReadKey();
}

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧