happytc 发表于 2012-3-30 00:07:52

如果不确定“两个或两个以上的字符组合”到底是几位,那无疑是位数越低的重复次数越高。
afan 发表于 2012-3-29 23:45 http://www.autoitx.com/images/common/back.gif


    嗯,的确是这样,所以楼主这个问题并不是很好的一个可以深入讨论的问题
可能他自己也没有深入想过吧,可以稍稍改一下,变成:
“删除字符串里的重复字符”就有意思多了

user3000 发表于 2012-3-30 09:18:19

本帖最后由 user3000 于 2012-3-30 09:32 编辑

无聊的产物, 只是跟正则沾点边, 其实用 StringInStr 更好吧.
原来的代码还有点错误,现在已修正.#include <array.au3>
Local $a = "anbancjffsanvdaf"
$a = "manbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahff"
;$a="manbanc12aaa3123jffsanadzwdanxsedffdffdffdffdffdffvdaf"
$array = _Get_Max_Substring($a)
_ArrayDisplay($array)

Func _Get_Max_Substring($str, $sLen = 2)
        Local $r =
        Local $len = StringLen($str)
        Local $offset, $count
        For $i = 1 To $len - $sLen + 1
                $subStr = StringMid($str, $i, $sLen)
                $count = 1
                $offset = 1
                While 1
                        StringRegExp($str, $subStr, 1, $offset)
                        If @error = 0 Then
                                $offset = @extended
                                $count += 1
                        Else
                                ExitLoop
                        EndIf
                WEnd
                If $count > $r Then
                        $r = $count
                        $r = $subStr
                EndIf
        Next
        Return $r
EndFunc   ;==>_Get_Max_Substring

happytc 发表于 2012-3-30 09:41:11

本帖最后由 happytc 于 2012-3-30 09:42 编辑

无聊的产物, 只是跟正则沾点边, 其实用 StringInStr 更好吧.
原来的代码还有点错误,现在已修正.
user3000 发表于 2012-3-30 09:18 http://www.autoitx.com/images/common/back.gif

效率有点低
我把你的Code中的字符串增加了拷贝了20次,计算时间就比较长了,我的机子上花了10秒


#include <array.au3>
Local $hInit = TimerInit()
Local $a ="manbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahff"
;$a="manbanc12aaa3123jffsanadzwdanxsedffdffdffdffdffdffvdaf"
$array = _Get_Max_Substring($a)
Local $iDiff = TimerDiff($hInit)
MsgBox(0, 0, $iDiff)
_ArrayDisplay($array)

Func _Get_Max_Substring($str, $sLen = 2)
      Local $r =
      Local $len = StringLen($str)
      Local $offset, $count
      For $i = 1 To $len - $sLen + 1
                $subStr = StringMid($str, $i, $sLen)
                $count = 1
                $offset = 1
                While 1
                        StringRegExp($str, $subStr, 1, $offset)
                        If @error = 0 Then
                              $offset = @extended
                              $count += 1
                        Else
                              ExitLoop
                        EndIf
                WEnd
                If $count > $r Then
                        $r = $count
                        $r = $subStr
                EndIf
      Next
      Return $r
EndFunc   ;==>_Get_Max_Substring

35888894 发表于 2012-3-30 09:43:55

感谢大家热心的帮忙,问题搞定了。。。
解决方法1,在网上下了一个分词字典,大概28W个单词,但是auto的速度,你们懂的。。
解决方法2,后台调用这个http://www.ftphp.com/scws/demo/pscws23/demo.php
我觉得正则应该可以实现的,虽然心有不甘,但是苦于能力有限,呵呵,这里抛砖引玉,希望大家都能有所收获。

3mile 发表于 2012-3-30 10:01:42

对你的28W个单词的词典很有兴趣,能否上传下.
中文分词的话个人感觉ICTCLAS不错.

user3000 发表于 2012-3-30 10:02:17

效率有点低
我把你的Code中的字符串增加了拷贝了20次,计算时间就比较长了,我的机子上花了10秒
happytc 发表于 2012-3-30 09:41 http://www.autoitx.com/images/common/back.gif

我的正则与AU3一样都是入门级的,效率啥的很多时候根本就是没做考虑.
或是根本做不到高效率哦.

35888894 发表于 2012-3-30 10:31:06

回复 20# 3mile

3mile 发表于 2012-3-30 10:57:05

好玩的问题,难度很大.
只用正则搞不定.
以下代码只为抛个烂砖头,希望能引来好玉.
#include <Array.au3>
Local $Str = ''
$Str &= 'manbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
$Str &= 'a3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahff'
Local $Test = StringRegExp($str, '(.{2})(?=[^\1]*\1)', 3)
_ArraySort($Test)

Local $Temp_Array

For $i=0 To UBound($Test)-1
        $Temp_Array[$i]=$Test[$i]
        $Temp_Array[$i]=1
Next

For $i=0 To UBound($Test)-2
        If $Temp_Array[$i]==$Temp_Array[$i+1] Then
                $Temp_Array[$i]=''
                $Temp_Array[$i+1]=$Temp_Array[$i]+1
        EndIf
Next
_ArraySort($Temp_Array,1,0,0,1)
_ArrayDisplay($Temp_Array)
$output=StringRegExpReplace($str,$Temp_Array,'')
MsgBox(0,0,"出现最多的:"&$Temp_Array&@CRLF&"次数:"&@extended)
页: 1 [2]
查看完整版本: [已解决]求助,如何利用正则表达式获取一段文本中重复次数最多的字符串