本帖最后由 298311657 于 2010-1-20 03:03 编辑
几天没上论坛,又出新题目了啊
我用正则匹配写了一个Dim $a[1][2] = [[1,'']], $Out = ''
$begin = TimerInit()
;取文本数据
$file = FileOpen("a.txt", 0)
If $file = -1 Then Exit
$chars = FileRead($file)&@CRLF&@CRLF
FileClose($file)
;正则匹配取得的文本内容
$nOffset = 1
While 1
$array = StringRegExp($chars, '^:.*?|\n:.*?', 1, $nOffset)
If @error = 0 Then
$nOffset = @extended
ReDim $a[$a[0][0] + 1][2]
$a[0][0] += 1
$a[$a[0][0]-1][0] = $nOffset - 1
Else
ExitLoop
EndIf
WEnd
$a[0][0] -= 1
If $a[0][0] = 0 Then Exit;未发现:开始的段落则退出
;取出各段落的内容
For $i = 1 To $a[0][0]
If $i = $a[0][0] Then
$a[$i][1] = StringMid($chars,$a[$i][0])
Else
$a[$i][1] = StringMid($chars,$a[$i][0],$a[$i+1][0]-$a[$i][0])
EndIf
Next
;对段落进行排序,也许还有更高效的算法
For $i = 1 To $a[0][0]
For $s = $i To $a[0][0] - 1
If $a[$i][1] > $a[$s+1][1] Then
$tmp0 = $a[$i][0]
$tmp1 = $a[$i][1]
$a[$i][0] = $a[$s+1][0]
$a[$i][1] = $a[$s+1][1]
$a[$s+1][0] = $tmp0
$a[$s+1][1] = $tmp1
Else
ExitLoop
EndIf
Next
Next
;整理输出
For $i = 1 To $a[0][0]
If $i = $a[0][0] Then
$Out &= StringRegExpReplace($a[$i][1],'\n\s*\r','');删除最后的输出段落的空白符
Else
$Out &= $a[$i][1]
EndIf
Next
$dif = TimerDiff($begin)
MsgBox(0,'耗时'&$dif,$Out)
|