找回密码
 加入
搜索
查看: 5321|回复: 12

[效率算法] 关于正则的写法提问【已解决】

  [复制链接]
发表于 2014-12-6 21:41:40 | 显示全部楼层 |阅读模式
本帖最后由 gto250 于 2014-12-6 22:32 编辑

我有一段数据需要提取,采用正则的方式进行转换。
在正常的情况下,能实现要求。代码如下
#include<array.au3>
$str="a a   a  a,a、a"
$ret=StringRegExpReplace($str,"\s+|\,|、","|")
$str_arr=StringSplit($ret,"|")
_ArrayDisplay($str_arr)

输出为:a|a|a|a|a|a

但是由于该数据输入不可控,有时会出现错误的输入。代码如下
#include<array.au3>
$str="a a ,  a  a,a、a"
$ret=StringRegExpReplace($str,"\s+|\,|、","|")
$str_arr=StringSplit($ret,"|")
_ArrayDisplay($str_arr)

输出为:a|a|||a|a|a|a
StringSplit后就出现了空值的状况。

另一种错误的输入。代码如下:
#include<array.au3>
$str="|a a ,  a  a,a、a"
$ret=StringRegExpReplace($str,"\s+|\,|、","|")
$str_arr=StringSplit($ret,"|")
_ArrayDisplay($str_arr)

输出为: |a|a|||a|a|a|a
当然这个错误的输入,也会表现为,在字符串的任意处会有|的存在,导致StringSplit后就出现了空值

a表示任意长度的字符串。
想要实现的是将顿号,逗号,任意长度的空白符替换为|分隔符,然后分割该字符串

以上的错误情况可以归结为:
1、在需提取的字符串间同时存在顿号、逗号或者是空白符,导致替换后|与|连续存在,分割后出现空值
2、由于输入的字符串不可控,导致字符串任意区间存在|间隔符,分割后出现空值

当然,在分割后,进行数组循环,对空值进行忽略,重新生成一个数组这个方法可以满足我的要求。
但是我想用StringRegExp实现提取像“ |a|a|||a|a|a|a|”这样的字符串中,|与|之间的非空值数据,当然,也有可能字符串的的第一个|之前的数据也需要提取,像这样“a|a|||a|a|a|a”
因为对正则不怎么熟悉,所以在此提问,希望获得帮助
发表于 2014-12-6 21:58:24 | 显示全部楼层
直接正则匹配啊
#include <Array.au3>
Local $Str = '|a b  , c  d,e、f'
Local $aSR = StringRegExp($str, '[^、,|\s]+', 3)
_ArrayDisplay($aSR, UBound($aSR))

评分

参与人数 1金钱 +10 收起 理由
lpxx + 10 学习了

查看全部评分

发表于 2014-12-6 22:02:12 | 显示全部楼层
回复 1# gto250
可以再进一步替换,把 '|{2,} '换成' |'
当然也可以一步到位:
#include<array.au3>
$str="|a1 a2 ,  a3  a4,a5、a6"
$ret=StringRegExp($str,"[^\s,、]+",3)
If Not @error Then _ArrayDisplay($ret)

评分

参与人数 1金钱 +10 收起 理由
lpxx + 10 学习了

查看全部评分

发表于 2014-12-6 22:14:27 | 显示全部楼层
一定要用替换的话,可如下方法:
#include <array.au3>
$str="|a a ,  a  a,a、a"
$ret=StringRegExpReplace($str,"\|","")
$ret=StringRegExpReplace($ret,"[ ,、]+","|")
$str_arr=StringSplit($ret,"|")
_ArrayDisplay($str_arr)
 楼主| 发表于 2014-12-6 22:15:47 | 显示全部楼层
本帖最后由 gto250 于 2014-12-6 22:19 编辑

回复 2# afan


    感谢回复答案,收益良多,有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面,或者去掉,还是能得出正确的字符串
 楼主| 发表于 2014-12-6 22:15:57 | 显示全部楼层
回复 3# user3000


    感谢回复答案,收益良多
 楼主| 发表于 2014-12-6 22:18:58 | 显示全部楼层
回复 4# shqf

谢谢,不一定要替换,我想用正则,就是想一步到位,只是对正则不熟悉,能力有限,所以只能想出用替换的方式
发表于 2014-12-6 22:21:43 | 显示全部楼层
回复 2# afan

最近闲得紧呀,竟然抢我沙发啦.
 楼主| 发表于 2014-12-6 22:22:48 | 显示全部楼层
回复 8# user3000


    有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面,或者去掉,还是能得出正确的字符串
发表于 2014-12-6 22:29:01 | 显示全部楼层
回复 9# gto250

放[]里面在对于这个正则表达式是完全没有意义的,就是画蛇添足.
+ 代表着至少匹配一个字符,所以就避免了匹配类似两个逗号相连的"空串".
去掉+,就只匹配一个,你去掉还能得到正确的串,只是示例串的标点之间字符正好都是1个.
 楼主| 发表于 2014-12-6 22:31:30 | 显示全部楼层
回复 10# user3000


    谢谢,我试验了,的确如此,当字符为一个以上时,没有+的话,每个字符都是分开的。受教了
发表于 2014-12-6 22:31:35 | 显示全部楼层
回复  afan


    感谢回复答案,收益良多,有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面 ...
gto250 发表于 2014-12-6 22:15



    放在里面就是代表加号字符串了~~ 去掉也能匹配 是因为+是代表前面的匹配需要一个或一个以上,你提供的字符串只有单个,所以去掉+也没区别,如果是 a aa  abc 这样的,就会有区别了
 楼主| 发表于 2014-12-6 22:34:02 | 显示全部楼层
回复 12# afan


    谢谢!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-12 03:33 , Processed in 0.083147 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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