gto250 发表于 2014-12-6 21:41:40

关于正则的写法提问【已解决】

本帖最后由 gto250 于 2014-12-6 22:32 编辑

我有一段数据需要提取,采用正则的方式进行转换。
在正常的情况下,能实现要求。代码如下
#include<array.au3>
$str="a a   aa,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 ,aa,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 ,aa,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”
因为对正则不怎么熟悉,所以在此提问,希望获得帮助

afan 发表于 2014-12-6 21:58:24

直接正则匹配啊#include <Array.au3>
Local $Str = '|a b, cd,e、f'
Local $aSR = StringRegExp($str, '[^、,|\s]+', 3)
_ArrayDisplay($aSR, UBound($aSR))

user3000 发表于 2014-12-6 22:02:12

回复 1# gto250
可以再进一步替换,把 '|{2,} '换成' |'
当然也可以一步到位:#include<array.au3>
$str="|a1 a2 ,a3a4,a5、a6"
$ret=StringRegExp($str,"[^\s,、]+",3)
If Not @error Then _ArrayDisplay($ret)

shqf 发表于 2014-12-6 22:14:27

一定要用替换的话,可如下方法:#include <array.au3>
$str="|a a ,aa,a、a"
$ret=StringRegExpReplace($str,"\|","")
$ret=StringRegExpReplace($ret,"[ ,、]+","|")
$str_arr=StringSplit($ret,"|")
_ArrayDisplay($str_arr)

gto250 发表于 2014-12-6 22:15:47

本帖最后由 gto250 于 2014-12-6 22:19 编辑

回复 2# afan


    感谢回复答案,收益良多,有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面,或者去掉,还是能得出正确的字符串

gto250 发表于 2014-12-6 22:15:57

回复 3# user3000


    感谢回复答案,收益良多

gto250 发表于 2014-12-6 22:18:58

回复 4# shqf

谢谢,不一定要替换,我想用正则,就是想一步到位,只是对正则不熟悉,能力有限,所以只能想出用替换的方式

user3000 发表于 2014-12-6 22:21:43

回复 2# afan

最近闲得紧呀,竟然抢我沙发啦.

gto250 发表于 2014-12-6 22:22:48

回复 8# user3000


    有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面,或者去掉,还是能得出正确的字符串

user3000 发表于 2014-12-6 22:29:01

回复 9# gto250

放[]里面在对于这个正则表达式是完全没有意义的,就是画蛇添足.
+ 代表着至少匹配一个字符,所以就避免了匹配类似两个逗号相连的"空串".
去掉+,就只匹配一个,你去掉还能得到正确的串,只是示例串的标点之间字符正好都是1个.

gto250 发表于 2014-12-6 22:31:30

回复 10# user3000


    谢谢,我试验了,的确如此,当字符为一个以上时,没有+的话,每个字符都是分开的。受教了

afan 发表于 2014-12-6 22:31:35

回复afan


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


    放在里面就是代表加号字符串了~~ 去掉也能匹配 是因为+是代表前面的匹配需要一个或一个以上,你提供的字符串只有单个,所以去掉+也没区别,如果是 a aaabc 这样的,就会有区别了

gto250 发表于 2014-12-6 22:34:02

回复 12# afan


    谢谢!
页: [1]
查看完整版本: 关于正则的写法提问【已解决】