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

[效率算法] (已解决)在配置文件中设置通用字符,辨别变量和普通字符()

 火.. [复制链接]
发表于 2011-3-31 22:44:31 | 显示全部楼层
本帖最后由 afan 于 2011-3-31 22:50 编辑

算了,都用数组吧,我已经写好了
Dim $xx[3]
$xx[0] = 100
$xx[1] = 200
$AA = '车外圆{~1:Φ:%$xx[0]-1.5%::0:-0.19~},保持尺寸{~2::%$xx[1]-1.5%::0.5~}' 

MsgBox(0, '', _Execute($AA))

Func _Execute($s_ini)
        Local $sR = StringRegExp($s_ini, '%\$([^%]+)\[(\d+)\](?:([\*\+-\/])(\d+(?:\.\d+)?))?%', 3)
        If @error Then Return SetError(1, 0, $s_ini)
        If Not IsDeclared($sR[0]) Then Return SetError(2, 0, $s_ini)
        Local $tmp, $val, $i
        For $i = 0 To UBound($sR) - 1 Step 4
                $tmp = Eval($sR[$i])
                If (UBound($sR) > $i + 2) And StringRegExp($sR[$i + 2], '[\*\+-\/]') Then
                        $val = Execute($tmp[$sR[$i + 1]] & $sR[$i + 2] & $sR[$i + 3])
                Else
                        $val = $tmp[$sR[$i + 1]]
                        $i -= 2
                EndIf
                $s_ini = StringRegExpReplace($s_ini, '%\$[^%]+%', $val, 1)
        Next
        Return $s_ini
EndFunc   ;==>_Execute

评分

参与人数 1金钱 +26 收起 理由
feicuiboy + 26 A老大,我按照新的思路编写了代码,但是执行 ...

查看全部评分

 楼主| 发表于 2011-3-31 22:50:34 | 显示全部楼层
回复 31# afan


    谢谢,谢谢A大,今天麻烦你这么多。。。。。。。。


我照您提供的正则先编写了,出成果了一定不忘记你,晚安!
发表于 2011-4-4 17:01:42 | 显示全部楼层
看不明白是什么东西
发表于 2011-4-4 22:49:05 | 显示全部楼层
越看越不明白,给出公式S=X+Y,然后替换不行吗?
发表于 2011-4-6 18:15:44 | 显示全部楼层
很纠结地说看不懂,高深
发表于 2011-4-6 22:57:58 | 显示全部楼层
反正这明显是走远路
多是自己定义的,没事绕这么远走
 楼主| 发表于 2011-4-20 00:48:08 | 显示全部楼层
本帖最后由 feicuiboy 于 2011-4-20 00:58 编辑

(我的思路)
我没有按照正则,用了字符查找函数。因为变量界定符(这里是百分号)出现是成对出现的,截取并 计算第1~2个百分号,第3~4个百分号,第5~6个百分号表达式的值,并连接第1个百分号前,第2~3个百分号,第4~5个百分号,,第6~7个百分号之间的字符串
我编写了下面的代码,但是无法返回值,不知道在哪出错了,请A大或哪位明白的帮看下,谢谢
#Include <String.au3>
Global $xx[5]
$xx[1]=5
Global $xxx = "车外圆{~1:Φ:%$xx[1]-1.5%::0:-0.19~},保持尺寸{~2::%$xx[1]-1.5%::0.5~}"
Global $str = "%"
MsgBox(0,"",_str($xxx, $str))

Func _str($strs, $str) ;"字符串", "子字符串" 
Local  $str1[20], $str_tmp,$i_tmp,$str_result[20]
$i_tmp=0
Local $str_total=""
        For $i = 1 To 20  ;读取该段字符串含特定字符的数目
                $str_tmp = StringInStr($strs, $str, 0, $i) ;寻找指定字符的位置
                $str1[$i] = $str_tmp  ;找到第i个字符的位置
                        If $str1[$i] >1 Then ;如果存在第i个字符,则
                                $i_tmp= $i ;总的数目
                        Else
                        EndIf
                        Next
        
If $str1[1]=0 Then  ;如果不存在变指定字符,则返回整个字符
Return $strs
Else 
        $str_result[0]=StringLeft( $strs, $str1[1]-1) ;最左边字符串
        $str_total=$str_result[0]
        For $i=1 To $i_tmp  Step 2 ;对变量进行运算
                 $str_result[$i]=Execute(StringMid($strs,$str1[$i]+1,$str1[$i+1]-$str1[$i]-1))  ;返回 1~2,3~4,5~6表达式的值 ,未完成
                $str_result[$i+1]=StringMid($strs,$str1[$i+1]+1,$str1[$i+2]-$str1[$i+1]-1) ;第2~3个百分号,第4~5个百分号,,第6~7个百分号之间的字符
                $str_total&=$str_result[$i]&$str_result[$i+1]
        Next         
        Return         $str_total
EndIf
        EndFunc   ;==>_str
 楼主| 发表于 2011-4-20 01:04:57 | 显示全部楼层
本帖最后由 feicuiboy 于 2011-4-20 22:15 编辑

回复 31# afan

A大,您的这段代码对于 %%之间有两个变量,比方
Dim $xx[3]
$xx[0] = 100
$xx[1] = 200
$AA = '车外圆{~1:Φ:%$xx[0]-1.5+$xx[1] %::0:-0.19~},保持尺寸{~2::%$xx[1]-1.5%::0.5~}' 

MsgBox(0, '', _Execute($AA))

Func _Execute($s_ini)
        Local $sR = StringRegExp($s_ini, '%\$([^%]+)\[(\d+)\](?:([\*\+-\/])(\d+(?:\.\d+)?))?%', 3)
        If @error Then Return SetError(1, 0, $s_ini)
        If Not IsDeclared($sR[0]) Then Return SetError(2, 0, $s_ini)
        Local $tmp, $val, $i
        For $i = 0 To UBound($sR) - 1 Step 4
                $tmp = Eval($sR[$i])
                If (UBound($sR) > $i + 2) And StringRegExp($sR[$i + 2], '[\*\+-\/]') Then
                        $val = Execute($tmp[$sR[$i + 1]] & $sR[$i + 2] & $sR[$i + 3])
                Else
                        $val = $tmp[$sR[$i + 1]]
                        $i -= 2
                EndIf
                $s_ini = StringRegExpReplace($s_ini, '%\$[^%]+%', $val, 1)
        Next
        Return $s_ini
EndFunc   ;==>_Execute
这样的形式,就无法计算,您看下我37楼的代码,为什么出不了效果,谢谢












数组超出范围,已经自己解决了,谢谢大家,上面的代码是正确的,可以借鉴使用,谢谢


http://autoitx.com/thread-23919-1-1.html
 楼主| 发表于 2011-4-20 22:19:04 | 显示全部楼层
数组超出范围,已经自己解决了,谢谢大家,上面的代码是正确的,可以借鉴使用,谢谢

http://autoitx.com/thread-23919-1-1.html
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 21:52 , Processed in 0.080912 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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