关于正则的写法提问【已解决】
本帖最后由 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”
因为对正则不怎么熟悉,所以在此提问,希望获得帮助 直接正则匹配啊#include <Array.au3>
Local $Str = '|a b, cd,e、f'
Local $aSR = StringRegExp($str, '[^、,|\s]+', 3)
_ArrayDisplay($aSR, UBound($aSR)) 回复 1# gto250
可以再进一步替换,把 '|{2,} '换成' |'
当然也可以一步到位:#include<array.au3>
$str="|a1 a2 ,a3a4,a5、a6"
$ret=StringRegExp($str,"[^\s,、]+",3)
If Not @error Then _ArrayDisplay($ret) 一定要用替换的话,可如下方法:#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:19 编辑
回复 2# afan
感谢回复答案,收益良多,有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面,或者去掉,还是能得出正确的字符串 回复 3# user3000
感谢回复答案,收益良多 回复 4# shqf
谢谢,不一定要替换,我想用正则,就是想一步到位,只是对正则不熟悉,能力有限,所以只能想出用替换的方式 回复 2# afan
最近闲得紧呀,竟然抢我沙发啦. 回复 8# user3000
有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面,或者去掉,还是能得出正确的字符串 回复 9# gto250
放[]里面在对于这个正则表达式是完全没有意义的,就是画蛇添足.
+ 代表着至少匹配一个字符,所以就避免了匹配类似两个逗号相连的"空串".
去掉+,就只匹配一个,你去掉还能得到正确的串,只是示例串的标点之间字符正好都是1个. 回复 10# user3000
谢谢,我试验了,的确如此,当字符为一个以上时,没有+的话,每个字符都是分开的。受教了 回复afan
感谢回复答案,收益良多,有一个问题,为什么要把+放在[]的外面呢, 我吧+放在s的后面 ...
gto250 发表于 2014-12-6 22:15 http://www.autoitx.com/images/common/back.gif
放在里面就是代表加号字符串了~~ 去掉也能匹配 是因为+是代表前面的匹配需要一个或一个以上,你提供的字符串只有单个,所以去掉+也没区别,如果是 a aaabc 这样的,就会有区别了 回复 12# afan
谢谢!
页:
[1]