找回密码
 加入
搜索
查看: 8807|回复: 16

[AU3基础] [已解决]关于文本解析,stringsplit函数的疑问

 火.. [复制链接]
发表于 2012-4-19 18:18:13 | 显示全部楼层 |阅读模式
本帖最后由 blankboy 于 2012-5-2 11:28 编辑

stringsplit()是用来拆分字符串的.返回的是拆分好的数组.我这里想用空格拆分,但是当有多个空格时,会拆分出空的字符串.具体的测试代码如下:
#include<Array.au3>

$str = "a          b"
$s = StringSplit($str,"  ")
_ArrayDisplay($s)
$ss = ""
For $i = 1 To $s[0]
        $ss = $ss & StringLen($s[$i]) & @CRLF
Next
MsgBox(0,"",$ss)
If StringIsSpace($s[2]) Then
        MsgBox(0,"","yes")
Else
        MsgBox(0,"","no")
EndIf
        
在au3中,是不是多个分隔符连在一起都会这样?其实我一直认为这样分割出来的会是空格..结果都是空字符串...卡了一个多小时..都在用stringisspace来判断是否有多个空格,始终不对.
好吧,是我太菜了.帮助文档有时候确实不是万能的..
发表于 2012-4-19 18:40:24 | 显示全部楼层
用长度不定的空格拆分字符串,StringSplit 是不合适的,应该用正则
#include<Array.au3>
$str = 'a          b'
$a = StringRegExp($str, '\H+', 3)
_ArrayDisplay($a)

评分

参与人数 1金钱 +10 收起 理由
user3000 + 10 刷新第二次时, 您突然冒在了前面!

查看全部评分

发表于 2012-4-19 18:44:53 | 显示全部楼层
东西活学活用才好! 比如你给出的示例中, 可以先清除掉多余的空格再处理吧?
这里我先举个笨拙但易理解的:
#include<Array.au3>
$str = "a          b"
While 1
        If StringInStr($str, '  ') Then
$str = StringReplace($str,'  ', ' ')
Else
        ExitLoop
EndIf
WEnd
$s = StringSplit($str," ")
_ArrayDisplay($s)
$ss = ""
For $i = 1 To $s[0]
        $ss = $ss & StringLen($s[$i]) & @CRLF
Next
MsgBox(0,"",$ss)

最后想说, 如果经常性的又想方便的处理各类字符串, 那很有必要学一学正则表达式.
比如上面的相关示例可以这样处理, 更简洁和方便:
#include<Array.au3>
$str = "a          b"
$s = StringRegExp($str, '\H', 3)
_ArrayDisplay($s)
$str = StringRegExpReplace($str, '\h+', ' ')
MsgBox(0, 'Deleted', $str)

评分

参与人数 2金钱 +40 收起 理由
whitehead + 20
afan + 20 不好意思,又插了一脚 :)

查看全部评分

发表于 2012-4-19 18:49:25 | 显示全部楼层
如果对正则不熟,也可以
#include<Array.au3>
$str = 'a          b'
$str = StringStripWS($str, 4)
$a = StringSplit($str, ' ')
_ArrayDisplay($a)
发表于 2012-4-19 18:50:13 | 显示全部楼层
回复 2# afan
刷新第一遍时, 没看到您的回复啊.
回复完再刷新就出来了! 呵呵!

对于有问题者, 越多人插上一脚才好, 尤其是像您这样的大能者!

评分

参与人数 1金钱 +10 收起 理由
afan + 10 惭愧,能力实在微小

查看全部评分

 楼主| 发表于 2012-4-19 18:58:07 | 显示全部楼层
回复 2# afan


    嗯,正则在文本处理方面确实是不可回避的坎.自己只是很少用,所以现在没来得及学,到时要大规模处理的时候再学.
 楼主| 发表于 2012-4-19 18:59:19 | 显示全部楼层
回复 3# user3000


    对空格进行消除用下面a大的函数更好,我查手册的时候粗心了.
 楼主| 发表于 2012-4-19 18:59:58 | 显示全部楼层
回复 4# afan


    对于没有正则基础的来说,这确实是比较优的解决方法.
发表于 2012-4-19 19:08:38 | 显示全部楼层
回复 7# blankboy
惭愧, 用惯了正则, 一时真想不起 StringStripWS 这函数.
如果是空格, 当然用 StringStripWS 来合适!
就怕是别的字符了!
发表于 2012-4-19 21:37:58 | 显示全部楼层
回复 4# afan
4 = 删除每个字符之间的双空格(或更多)
原来用StringStripWS这个函数一直以为是消除字符串中的所有空格,原来4的功能还能去除多空格只保留一个空格,又加深学习了。
我看帮助文件不仔细啊!感谢Afan大大。
发表于 2012-4-19 21:40:19 | 显示全部楼层
回复 3# user3000
学习了,好多方法,异曲同工!
发表于 2012-4-19 23:25:24 | 显示全部楼层
东西活学活用才好! 比如你给出的示例中, 可以先清除掉多余的空格再处理吧?
这里我先举个笨拙但易理解的:
...
user3000 发表于 2012-4-19 18:44

第一个看懂了,第二个里的\h是什么含义?
发表于 2012-4-19 23:53:23 | 显示全部楼层
回复 12# whitehead

第二个是正则啊, \h 任何的水平空白字符  + 代表一个或多个此字符
这是正则基础, 你直接点这里的
 StringRegExp
就能看到详细说明啦!

评分

参与人数 1金钱 +20 贡献 +5 收起 理由
whitehead + 20 + 5

查看全部评分

发表于 2012-4-20 10:17:11 | 显示全部楼层
回复 4# afan


学习了,这方法也不错唉。以前还真没注意到时这个函数。
发表于 2012-4-20 18:27:51 | 显示全部楼层
回复  whitehead

第二个是正则啊, \h 任何的水平空白字符  + 代表一个或多个此字符
这是正则基础, 你直 ...
user3000 发表于 2012-4-19 23:53


惭亏,谢谢user3000兄指教
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-15 06:33 , Processed in 0.102771 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表