找回密码
 加入
搜索
楼主: lixiaolong

[AU3基础] [正则练习] 删除各行的重复字符

 火... [复制链接]
发表于 2011-12-8 23:13:08 | 显示全部楼层
正在学呀·!!!
发表于 2011-12-10 14:55:21 | 显示全部楼层
看看啥内容
发表于 2011-12-10 19:23:30 | 显示全部楼层
来学习正则了
发表于 2011-12-10 21:49:47 | 显示全部楼层
高手就是高手啊,厉害学习了
发表于 2011-12-10 22:12:23 | 显示全部楼层
看了这个题目,忽然想到,稍稍换换方向:找到字符串中第一个只出现一次的字符

不限于正则,大家试试做做

评分

参与人数 1金钱 +10 收起 理由
lixiaolong + 10 好玩的题~

查看全部评分

发表于 2011-12-11 00:09:25 | 显示全部楼层
楼主 可否给像我一样菜的鸟们 讲讲这句正则的意思?...

 楼主| 发表于 2011-12-11 10:56:24 | 显示全部楼层
回复 22# bdancerlc

这是我的理解,希望对大家有帮助,我语文学的不好请原谅.

(.)(?=.*\1)

.
(匹配除换行以外的任何的单字符)
这样说好理解吧,.喜欢吃任何单字符,但不喜欢吃换行.

*
重复前一个字符, 设置或组合 0 或更多次. 等价于 {0,}.

.*
可能有任何的单字符 0个或者更多个.

比如有这样的字符串.
bdeac
cdeab
用了这个表达式 .* 它匹配 bdeac回车符,cdeab回车符.

(?=exp)
后面必须有【exp】.
详细的说,它匹配exp的【e】前面的位置(不是匹配exp前面的字符,是位置).
也就是说没有【exp】不成立.

\1($1也可以)
(exp) 匹配exp,并捕获文本到自动命名的组里.

这里是(.),它捕获了任何的单字符.
比如有这样的字符串【abc】,它捕获了【a】,它捕获了【b】,它捕获了【c】.


和(.)匹配的单字一样的单字,比如(.)匹配了【a】\1也是【a】.

(.)(?=.*\1)
已匹配的单字后面可能有任何的单字符 0个或者更多个 并它的后面必须有和已匹配的单字一样的单字.


【abab】用这个字符串说明它的动作.

(.)匹配【a】,.*匹配了它后面的【b】,\1匹配了【aba】的最后面的【a】.
这时候(.)(?=.*\1)这个表达式就成立了,替换的是空白,这时候(.)匹配的【a】就已经替换成空白了.

现在剩了【bab】.
(.)匹配【b】,.*匹配了它后面的【a】,\1匹配了【bab】的最后面的【b】.
这时候(.)(?=.*\1)这个表达式就成立了,这时候(.)匹配的【b】就已经替换成空白了.

现在剩的是【ab】.
(.)匹配【a】,.*匹配了它后面的【b】,\1没有匹配的东西,即表达式不成立.

继续...
(.)匹配【b】,.*没有匹配的东西,\1没有匹配的东西,即表达式不成立.

最后剩的是想要的结果【ab】.

评分

参与人数 1金钱 +20 收起 理由
bdancerlc + 20 不错,学习了...

查看全部评分

 楼主| 发表于 2011-12-11 13:22:05 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-12-11 14:38 编辑

回复 21# happytc

我来试试.(这个有问题)
游客,如果您要查看本帖隐藏内容请回复
 楼主| 发表于 2011-12-11 14:38:14 | 显示全部楼层
回复 21# happytc

上面的有问题,这个可以了.
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1金钱 +10 收起 理由
happytc + 10

查看全部评分

发表于 2011-12-12 18:07:46 | 显示全部楼层
回复 25# lixiaolong


我想了半天也想不出一次扫描就搞定的方法
 楼主| 发表于 2011-12-13 14:35:25 | 显示全部楼层
回复 26# happytc

一次扫描还是搞不定,上面的代码效率不好,测试了下面的字符串用的时间是大概850ms.
Local $Str = _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcdefg'
我把代码改了一点,现在是大概500ms了,但还是慢.
游客,如果您要查看本帖隐藏内容请回复
 楼主| 发表于 2011-12-13 15:03:34 | 显示全部楼层
回复 26# happytc

再来一个最快的,1ms之内!,但是这些代码有个缺点,就是字符太多就不行了.
游客,如果您要查看本帖隐藏内容请回复
发表于 2011-12-13 17:10:21 | 显示全部楼层
回复 28# lixiaolong
呵呵,这个有点意思。
试下:
Local $Str = _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abababab' & @CRLF & _
                'abcdeaccc' & @CRLF & _
                'abbjcdeab' & @CRLF & _
                'abcde' & @CRLF & _
                'aaaaaa' & @CRLF & _
                'abcdeg'
Local $ts = TimerInit()
$str=StringRegExpReplace($Str, '(.)(?=[^\1]+\1)', '$%^&*')
$str1=StringRegExp($str,'(?m)[^$%^&*\s]',1)
MsgBox(0,TimerDiff($ts),$str1[0])

评分

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

查看全部评分

 楼主| 发表于 2011-12-13 17:50:41 | 显示全部楼层
回复 29# 3mile

用正则还是有问题,把【j】去掉就不准了.
发表于 2011-12-13 18:23:49 | 显示全部楼层
回复 28# lixiaolong

最近特喜欢用递归,刚写了个,发现效率实在是差,这样的线性数据结构,用递归太浪费了。

还是写个循环的吧,用C效率就是高
#define CHARSET 128

int count[CHARSET]={0};
char ch;
char * q = p;
while((ch=*q++) != '\0') {
    ++count[ch];
}
q = p;
while((ch=*q++) != '\0') {
   if (count[ch] == 1) {
       printf("%c\n",ch);
       break;
   }
}
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 06:25 , Processed in 0.072953 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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