以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  数字+英文的 款号自动分析[已解決]  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=41352)

--  作者:realredred
--  发布时间:2013/10/17 14:38:00
--  数字+英文的 款号自动分析[已解決]

分別有款号列及客户列
款号的字节不规定
如:
08476R,MAR480,00039ER,00076EN,00940SE,08835E,GJP123等等

款号只有最后两位数是英文字並以E为首的话,客户=EXP
款号只有最后两位数是英文字並以S为首的话,客户=STR
款号只有最后一位数是英文字,或只有最前的3位数是英文字的话,客户=ATM

想爆脑子都搞不定
寻求指引

[此贴子已经被作者于2013-10-17 22:58:03编辑过]

--  作者:Bin
--  发布时间:2013/10/17 15:13:00
--  
Dim s As String = "00039ER"
If RegularExpressions.Regex.IsMatch(s,"\\w\\d[eE]{1}[a-zA-Z]{1}$") Then
    MessageBox.show("客户=EXP")
End If
If RegularExpressions.Regex.IsMatch(s,"\\w\\d[sS]{1}[a-zA-Z]{1}$") Then
    MessageBox.show("客户=STR")
End If
If RegularExpressions.Regex.IsMatch(s,"\\d[a-zA-Z]{1}$") OrElse RegularExpressions.Regex.IsMatch(s,"^[a-zA-Z]{3}\\d") Then
    MessageBox.show("客户=ATM")
End If

--  作者:狐狸爸爸
--  发布时间:2013/10/17 15:20:00
--  

呵呵,我再来个不用正则表达式的:

 

Dim nms() As String = {"08476R","MAR480","00039ER","00076EN","00940SE","08835E","GJP123"}
For Each nm As String In nms
    Dim v As String = nm.SubString(nm.Length -2)
    If Char.IsLetter(v.Chars(0)) AndAlso Char.IsLetter(v.Chars(1)) Then
        If v.Chars(0) = "e" Then
            output.show(nm & ":exp")
        ElseIf v.Chars(0) = "s" Then
            output.show(nm & "str")
        End If
    ElseIf Char.IsDigit(v.Chars(0)) AndAlso Char.IsLetter(v.Chars(1))  Then
        output.show(nm & ":atm")
    ElseIf Char.IsLetter(nm.Chars(0)) AndAlso Char.IsLetter(nm.Chars(1)) AndAlso  Char.IsLetter(nm.Chars(2))  Then
        output.show(nm & ":atm")
    End If
Next


--  作者:realredred
--  发布时间:2013/10/17 15:55:00
--  
因为款号每次都不同
不用遍历可以嗎?
改用e.DATAROW
应该可以吧

--  作者:狐狸爸爸
--  发布时间:2013/10/17 15:59:00
--  

当然你可以,这里告诉你的是判断的方法,有了方法,你怎么写都行。


--  作者:realredred
--  发布时间:2013/10/17 16:03:00
--  

小甜甜的 好像比较容易了解

 

If e.DataCol.Name = "款号"
    Dim dr1 As DataRow = e.DataRow
    Dim s As String = dr1("款号")
   
    If RegularExpressions.Regex.IsMatch(s,"\\w\\d[eE]{1}[a-zA-Z]{1}$") Then
        MessageBox.show("客户=EXP")
        dr1("客户") = "EXP"
    End If
    If RegularExpressions.Regex.IsMatch(s,"\\w\\d[sS]{1}[a-zA-Z]{1}$") Then
        MessageBox.show("客户=STR")
        dr1("客户") = "STR"
    End If
    If RegularExpressions.Regex.IsMatch(s,"\\d[a-zA-Z]{1}$") OrElse RegularExpressions.Regex.IsMatch(s,"^[a-zA-Z]{3}\\d") Then
        MessageBox.show("客户=ATM")
        dr1("客户") = "ATM"
    End If
   
End If


--  作者:realredred
--  发布时间:2013/10/17 16:04:00
--  

感谢狐爸和小甜甜指导

 

我再研究一下狐爸的方法

现在仍未看懂.


--  作者:狐狸爸爸
--  发布时间:2013/10/17 16:21:00
--  

呵呵,估计这样你就理解了:

 

Dim nm As String = "08476R"
Dim v As String = nm.SubString(nm.Length -2)
If Char.IsLetter(v.Chars(0)) AndAlso Char.IsLetter(v.Chars(1)) Then
    If v.Chars(0) = "e" Then
        output.show(nm & ":exp")
    ElseIf v.Chars(0) = "s" Then
        output.show(nm & "str")
    End If
ElseIf Char.IsDigit(v.Chars(0)) AndAlso Char.IsLetter(v.Chars(1))  Then
    output.show(nm & ":atm")
ElseIf Char.IsLetter(nm.Chars(0)) AndAlso Char.IsLetter(nm.Chars(1)) AndAlso  Char.IsLetter(nm.Chars(2))  Then
    output.show(nm & ":atm")
End If

 

我原来那样写,只是为了让你一次可以验证各种情况,结果适得其反。


--  作者:东坡一剑
--  发布时间:2013/10/17 16:51:00
--  
Bin:你这些代码好陌生,从哪里可以学?
--  作者:Bin
--  发布时间:2013/10/17 16:55:00
--  
以下是引用东坡一剑在2013-10-17 16:51:00的发言:
Bin:你这些代码好陌生,从哪里可以学?

百度 正则表达式