注册 登录
编程论坛 VFP论坛

关于substr 字符截取的请教,子串内容异常。

lnfx2019 发布于 2022-05-31 10:36, 1423 次点击
tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
?subs(tmp_check1,at("”",tmp_check1),at("装(",tmp_check1)-at("”",tmp_check1))
取得的子串为:  
”Ρ础盭GW7226D 无芯卫生纸 单提     
这个为错误的。

tmp_check1="“xiaobaobei/小”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
?subs(tmp_check1,at("”",tmp_check1),at("装(",tmp_check1)-at("”",tmp_check1))
取得的子串为:  
”XGW7226D 无芯卫生纸 单提
这个为正确的。

应用中,基本上获得的子串都是正确的,就是这次遇到这个出现异常了,请高手指教!!!
9 回复
#2
laowan0012022-05-31 10:56
tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
MESSAGEBOX(STREXTRACT(tmp_check1,'”','装'))
试试这样
#3
lnfx20192022-05-31 12:00
以下是引用laowan001在2022-5-31 10:56:07的发言:

tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
MESSAGEBOX(STREXTRACT(tmp_check1,'”','装'))
试试这样


谢谢你的指导!!
这个是在VFP 9.0 环境下好用,有没有在VFP6.0 环境下的解决方案呢?
#4
sdta2022-05-31 13:24
tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
alines(la, chrtran(tmp_check1, "(", chr(13)))
? substr(la[1],1)
下面应该会处理了吧
#5
lnfx20192022-05-31 14:50

谢谢您的指导!

tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
alines(la, chrtran(tmp_check1, "(", chr(13)))
? substr(la[1],1)
“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装

“xiaobaobei/小宝贝”   这个是商品的品牌,  单提  是计量单位  ,应用是想自动从商品名称中 获取 品牌与计量单位(含计量单位)间部分
以这个商品名称为例,应该需要获取到   
XGW7226D 无芯卫生纸 单提
这个字串,但这个商品,不知什么原因受   宝贝  这两个字影响,而获取到了
Ρ础盭GW7226D 无芯卫生纸 单提
如果从开始位置取,取到计量单位,这个串也是正确的:
?subs(tmp_check1,1,at("装(",tmp_check1)-1)
“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提

#6
ccb20002022-05-31 14:55
解决半个汉字的问题,可以使用支持双字节汉字的函数,例如:
?SUBSTRC(tmp_check1,at_c("”",tmp_check1),at_c("装(",tmp_check1)-at_c("”",tmp_check1))
#7
sych2022-05-31 15:10
?ASC(SUBSTR("小宝",2,1))
?ASC(SUBSTR("小宝",3,1))
?ASC(SUBSTR("小宝”",5,1))
?ASC(SUBSTR("小宝”",6,1))
第2、3字符和第5、6字符的ASC码相同,这是双字节造成的
AT_C( ) 是为包含双字节字符的表达式设计的。如果表达式只包含单字节, AT_C() 等同于 AT()。
tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
?SUBSTRC(tmp_check1,at_c("”",tmp_check1),at_c("装(",tmp_check1)-at_c("”",tmp_check1))
或者这样改写,分隔字符多取几个
tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
?SUBSTR(tmp_check1,at("”X",tmp_check1),at("装(",tmp_check1)-at("”X",tmp_check1))
#8
lnfx20192022-05-31 15:26
刚刚我也发现应该是汉字字节影响的问题,上来一看居然大家已经帮我写出来解决方法了!

汉字的问题,可以使用支持双字节汉字的函数,例如:
?SUBSTRC(tmp_check1,at_c("”",tmp_check1),at_c("装(",tmp_check1)-at_c("”",tmp_check1))
这个方法可以!!

十分感谢laowan001、sdta、ccb2000、sych的指导!!
正是有你们的无私奉献与分享,才会让我们这些VFP爱好者们始终不愿放弃她,才会让她依然散发着光和热。

愿我们的VFP论坛永远年青,各们爱好者们都可以在这里解决掉心中疑问!!
#9
sdta2022-05-31 19:06
tmp_check1="“xiaobaobei/小宝贝”XGW7226D 无芯卫生纸 单提装(4层加厚纸巾手纸厕纸128mm*120mm/节840克/提12卷/提)"
?SUBSTRC(tmp_check1,at_c("”",tmp_check1)+2,at_c("(",tmp_check1)-at_c("”",tmp_check1)-2)
#10
mywisdom882022-06-01 12:38
原来,ATC()=AT_C()的?我以前只知道有ATC()
1