以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  文本内容提取  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=121308)

--  作者:zcf2144
--  发布时间:2018/7/3 16:59:00
--  文本内容提取
怎么在一段文本中寻找符合特定条件的内容并返回特定数据。并且能够随时自定义这个条件
比如在:
“对夹蝶阀,涡轮操作,DN 1000 PN16,阀体 WCB,阀瓣:CF8,阀座EPDM,阀杆2CR13,零泄漏,设计和检验 DIN/EN,数量3 台;含税含包装含运费到上海价格。“
这段文字内,想要寻找所对应的阀体材质的信息。这时能给定一个特定格式的条件文本(正则表达式?),返回其材质信息为"WCB"。


我所想要实现的功能是通过客人询价的描述信息自动判断询价对应的产品信息。目前思路为建立一个表用作判断,根据条件得出结果并分配权重最后得出最准确的结果。不知道这思路有没有问题。
现在卡在,如何用文本格式表达条件语句。



望老师指点一二,感谢!

--  作者:有点蓝
--  发布时间:2018/7/3 20:35:00
--  
Dim str As String ="对夹蝶阀,涡轮操作,DN 1000 PN16,阀体 WCB,阀瓣:CF8,阀座EPDM,阀杆2CR13,零泄漏,设计和检验 DIN/EN,数量3 台;含税含包装含运费到上海价格."

For Each s As String In str.Split(",")
    If s.Contains("阀体") Then
        msgbox(s.Replace("阀体",""))
        Exit For
    End If
Next

--  作者:zcf2144
--  发布时间:2018/7/4 1:57:00
--  
感谢蓝老师。 但通过split跟replace还是不能很好地解决匹配条件的问题。 再比如说,还是上面的那一段例句。我要提取出客户要求的口径大小,即例句中的DN1000。但DN这两个字母是有可能出现在客人询价的任何地方的。这时contains的判断就失效了。 是不是有某种方法能找出字符串中符合条件格式的子字符串?比如DNxxx(xxx为数字)或者 阀体xxx(xxx为不限定字符长度的数字或字母组合),并且这个方法能够以字符串的形式被录入到表格中以可被程序动态调用
--  作者:有点甜
--  发布时间:2018/7/4 8:59:00
--  

参考代码

 

\'\'\'
Dim str1 As String = "对夹蝶阀,涡轮操作,DN 1000 PN16,阀体 WCB,阀瓣:CF8,阀座EPDM,阀杆2CR13,零泄漏,设计和检验 DIN/EN,数量3 台;含税含包装含运费到上海价格."
Dim str2 As String = "(?<=阀体).+?(?=[,,]+)"
Dim mc = System.Text.RegularExpressions.Regex.Matches(str1,str2)
For i As Integer = 0 To mc.count-1
    msgbox(mc(i).value)
Next


--  作者:zcf2144
--  发布时间:2018/7/4 15:44:00
--  
感谢甜老师,
完美解决了我的需求,
正在钻研正则表达式中图片点击可在新窗口打开查看

--  作者:zcf2144
--  发布时间:2018/7/6 9:22:00
--  
甜老师你好,
有个问题还是解决不掉,希望您再指点一下,
文本为:“ 阀体WCB 阀座Stellite "
原本要匹配的表达式为:(?<=体)(.+)?[(i?)WCB|(?i)CF8|(?i)CF8M|304|316].+(?<=座)(.+)?[(?i)STELLITE]
但是(?<=体)(.+)?[(?i)WCB|(?i)CF8|304].+(?<=座)(.+)?[316|(?i)CF8M]这段同样能被匹配成功?

思来想去感觉问题会出在(?i)这个忽略大小写的模式修饰符上。但是找不出具体原因来

--  作者:有点甜
--  发布时间:2018/7/6 9:43:00
--  

不明白你什么意思。你要匹配什么结果?

 

Dim str1 As String = "阀体WCB 阀座Stellite"
Dim str2 As String = "(?<=阀体).+?(?=[, ])"
Dim mc = System.Text.RegularExpressions.Regex.Matches(str1,str2)
For i As Integer = 0 To mc.count-1
    msgbox(mc(i).value)
Next


--  作者:zcf2144
--  发布时间:2018/7/6 9:56:00
--  
我的需求为,只要表达式有匹配到的文本,即返回True,若无返回False
对于“阀体WCB 阀座Stellite” 这段文本 原本只要表达式1匹配成功,而表达式2匹配失败。而现在两段表达式都匹配成功
表达式1:(?<=体)(.+)?[(i?)WCB|(?i)CF8|(?i)CF8M|304|316].+(?<=座)(.+)?[(?i)STELLITE]
表达式2:(?<=体)(.+)?[(?i)WCB|(?i)CF8|304].+(?<=座)(.+)?[316|(?i)CF8M
我明明在表达式2后面写了316或忽略大小写的CF8M,为什么还会匹配成功呢?

我的问题在于表达式的语法
望老师不厌其烦,指点迷津,感谢

--  作者:有点甜
--  发布时间:2018/7/6 10:17:00
--  
直接说明你的匹配逻辑。
--  作者:zcf2144
--  发布时间:2018/7/6 10:31:00
--  
比如一段文本描述中,
阀体为 WCB 或CF8或CF8M,同时阀座为Stellite,且不区分大小写。阀体与阀座与其描述中间可以有多个字符也可以没有字符。同样地,阀体与阀座中间也可以有多个字符也可以没有字符
例如:
-阀体wcb,阀瓣CF8,阀座Stellite
-阀体:CF8,阀瓣CF8,阀座stellite
-阀体CF8M阀座STELLITE
这三句都能匹配成功