nis 发表于 2011-12-8 23:13:08

正在学呀·!!!

menfan1 发表于 2011-12-10 14:55:21

看看啥内容

Hen5ei 发表于 2011-12-10 19:23:30

来学习正则了

sgj584520 发表于 2011-12-10 21:49:47

高手就是高手啊,厉害学习了

happytc 发表于 2011-12-10 22:12:23

看了这个题目,忽然想到,稍稍换换方向:找到字符串中第一个只出现一次的字符

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

bdancerlc 发表于 2011-12-11 00:09:25

楼主 可否给像我一样菜的鸟们 讲讲这句正则的意思?...

{:face (460):}

lixiaolong 发表于 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】.

lixiaolong 发表于 2011-12-11 13:22:05

本帖最后由 lixiaolong 于 2011-12-11 14:38 编辑

回复 21# happytc

我来试试.(这个有问题)
**** Hidden Message *****

lixiaolong 发表于 2011-12-11 14:38:14

回复 21# happytc

上面的有问题,这个可以了.
**** Hidden Message *****

happytc 发表于 2011-12-12 18:07:46

回复 25# lixiaolong


我想了半天也想不出一次扫描就搞定的方法

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了,但还是慢.
**** Hidden Message *****

lixiaolong 发表于 2011-12-13 15:03:34

回复 26# happytc

再来一个最快的,1ms之内!,但是这些代码有个缺点,就是字符太多就不行了.
**** Hidden Message *****

3mile 发表于 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)

lixiaolong 发表于 2011-12-13 17:50:41

回复 29# 3mile

用正则还是有问题,把【j】去掉就不准了.

happytc 发表于 2011-12-13 18:23:49

回复 28# lixiaolong

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

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

int count={0};
char ch;
char * q = p;
while((ch=*q++) != '\0') {
    ++count;
}
q = p;
while((ch=*q++) != '\0') {
   if (count == 1) {
       printf("%c\n",ch);
       break;
   }
}
页: 1 [2] 3
查看完整版本: [正则练习] 删除各行的重复字符