找回密码
 加入
搜索
查看: 8423|回复: 35

[AU3基础] 请教文本替换的问题(可能需要正则?) 已解决

[复制链接]
发表于 2016-4-12 14:31:20 | 显示全部楼层 |阅读模式
本帖最后由 hnfeng 于 2016-4-12 16:47 编辑
#include <Array.au3>

Global $t_RegExp = "\b(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\b"
Local $Text="asasaf 111.111.111.1aaa" & @CRLF & "asasaf 111.111.111.1" & @CRLF & "asasaf 111.111.111.11" & @CRLF & "asasaf 111.111.111.11aaa" & @CRLF & "asasaf 111.111.111.111" & @CRLF & "asasaf 111.111.111.111aaaa"

Local $a_IP = StringRegExp($Text, $t_RegExp, 3)
_ArraySort($a_IP)  ;排序
$a_IP = _ArrayUnique($a_IP, 0, 0, 0, 0)   ;去除重复值
; 假如由 $a_IP 得到了 下面的 $a_IP_Add

Local $a_IP_Add[3][2]=[["111.111.111.1","地址11111111111"], _
["111.111.111.11","地址22222222222222222222"], _
["111.111.111.111","地址33333"]]

_ArrayDisplay($a_IP_Add)
MsgBox(0,"原始文本",$Text)

; 下面的替换结果是不正确的
$Text=StringReplace($Text,$a_IP_Add[0][0],$a_IP_Add[0][0] & " [" & $a_IP_Add[0][1] & "]")
MsgBox(0,"替换111.111.111.1",$Text)

$Text=StringReplace($Text,$a_IP_Add[1][0],$a_IP_Add[1][0] & " [" & $a_IP_Add[1][1] & "]")
MsgBox(0,"替换111.111.111.11",$Text)

$Text=StringReplace($Text,$a_IP_Add[2][0],$a_IP_Add[2][0] & " [" & $a_IP_Add[2][1] & "]")
MsgBox(0,"替换111.111.111.111",$Text)



;~ StringRegExpReplace ( "字符串", "表达式", "替换", [ 数量 = 0] )
例如 想替换文本 $Text 中的 111.111.111.1111.111.111.1 [地址11111111111],但是使用上述命令后,还会替换 111.111.111.11、111.111.111.111 前面的 111.111.111.1 部分。如何才能避免这种错误?

搞掂了:
$Text=StringRegExpReplace($Text,"\b" & $a_IP_Add[0][0] & "\D",$a_IP_Add[0][0] & " [" & $a_IP_Add[0][1] & "]")
 楼主| 发表于 2016-4-12 14:32:21 | 显示全部楼层
看了 StringRegExpReplace 的帮助,不知道如何下手
发表于 2016-4-12 15:04:04 | 显示全部楼层
相当有意思,别人花金币帮忙。坐等坛子里大佬们的回复
 楼主| 发表于 2016-4-12 15:05:53 | 显示全部楼层
本帖最后由 hnfeng 于 2016-4-12 15:25 编辑

回复 3# zghwelcome


    不好意思,本来是想“悬赏”的,看错了
#include <Array.au3>  
Global $t_RegExp = "\b(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\b" 
Local $Text="asasaf 111.111.111.1aaa" & @CRLF & "asasaf 111.111.111.1" & @CRLF & "asasaf 111.111.111.11" & @CRLF & "asasaf 111.111.111.11aaa" & @CRLF & "asasaf 111.111.111.111" & @CRLF & "asasaf 111.111.111.111aaaa"  
Local $a_IP = StringRegExp($Text, $t_RegExp, 3) 
_ArraySort($a_IP)  ;排序 
$a_IP = _ArrayUnique($a_IP, 0, 0, 0, 0)   ;去除重复值 
; 假如由 $a_IP 得到了 下面的 $a_IP_Add  
Local $a_IP_Add[3][2]=[["111.111.111.1","地址11111111111"], _ 
["111.111.111.11","地址22222222222222222222"], _ 
["111.111.111.111","地址33333"]]  
_ArrayDisplay($a_IP_Add) 
MsgBox(0,"原始文本",$Text) 
 ; 下面的替换结果是不正确的 
$Text=StringReplace($Text,$a_IP_Add[0][0],$a_IP_Add[0][0] & " [" & $a_IP_Add[0][1] & "]") 
MsgBox(0,"替换111.111.111.1",$Text)  
$Text=StringReplace($Text,$a_IP_Add[1][0],$a_IP_Add[1][0] & " [" & $a_IP_Add[1][1] & "]") 
MsgBox(0,"替换111.111.111.11",$Text)  
$Text=StringReplace($Text,$a_IP_Add[2][0],$a_IP_Add[2][0] & " [" & $a_IP_Add[2][1] & "]") 
MsgBox(0,"替换111.111.111.111",$Text)
 楼主| 发表于 2016-4-12 16:01:09 | 显示全部楼层
StringRegExpReplace($Text, "\b111\.111\.111\.1\b", "new")

这样倒是可以,但是貌似 StringRegExpReplace 里面的正则表达式不支持 $xxxx 变量。
发表于 2016-4-12 16:14:55 | 显示全部楼层
回复 5# hnfeng

A版的正则用的炉火纯青,无人能出其右
发表于 2016-4-12 16:51:29 | 显示全部楼层
回复  hnfeng

A版的正则用的炉火纯青,无人能出其右
zghwelcome 发表于 2016-4-12 16:14



    给我戴那么大顶帽子,亚历山大…
我只是个菜鸟。
发表于 2016-4-12 16:53:59 | 显示全部楼层
这样倒是可以,但是貌似 StringRegExpReplace 里面的正则表达式不支持 $xxxx 变量。
hnfeng 发表于 2016-4-12 16:01



    因太乱 没细看!

估计 StringRegExpReplace($Text, "\b111\.111\.111\.1\b", "new")  改为你说的变量
StringRegExpReplace($Text, '\Q' & $xxxx & '\E', "new") 即可
发表于 2016-4-12 17:02:08 | 显示全部楼层
我擦~看了好半天才看明白题意,是不是这样?
直接说 原字符 是什么,目标字符是什么。多么简单的事,非要复杂化。
#include <Array.au3>
Global $t_RegExp = "\b(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[0-9]{2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\b"
Local $Text = "asasaf 111.111.111.1aaa" & @CRLF & "asasaf 111.111.111.1" & @CRLF & "asasaf 111.111.111.11" & @CRLF & "asasaf 111.111.111.11aaa" & @CRLF & "asasaf 111.111.111.111" & @CRLF & "asasaf 111.111.111.111aaaa"
Local $a_IP = StringRegExp($Text, $t_RegExp, 3)
_ArraySort($a_IP) ;排序
$a_IP = _ArrayUnique($a_IP, 0, 0, 0, 0) ;去除重复值
; 假如由 $a_IP 得到了 下面的 $a_IP_Add
Local $a_IP_Add[3][2] = [["111.111.111.1", "地址11111111111"], _
                ["111.111.111.11", "地址22222222222222222222"], _
                ["111.111.111.111", "地址33333"]]
_ArrayDisplay($a_IP_Add)
MsgBox(0, "原始文本", $Text)


; 下面的替换结果是不正确的
$Text = StringRegExpReplace($Text, $a_IP_Add[0][0] & "(\D)", $a_IP_Add[0][0] & " [" & $a_IP_Add[0][1] & "]\1")
MsgBox(0, "替换111.111.111.1", $Text)

$Text = StringRegExpReplace($Text, $a_IP_Add[1][0] & "(\D)", $a_IP_Add[1][0] & " [" & $a_IP_Add[1][1] & "]\1")
MsgBox(0, "替换111.111.111.11", $Text)

$Text = StringRegExpReplace($Text, $a_IP_Add[2][0] & "(\D)", $a_IP_Add[2][0] & " [" & $a_IP_Add[2][1] & "]\1")
MsgBox(0, "替换111.111.111.111", $Text)
发表于 2016-4-12 17:03:30 | 显示全部楼层
回复 8# afan


    确实是挺乱,老半天我都没看明白题意,猜着写的~吼吼~
发表于 2016-4-12 17:11:47 | 显示全部楼层
回复  afan


    确实是挺乱,老半天我都没看明白题意,猜着写的~吼吼~
haijie1223 发表于 2016-4-12 17:03


是的,主要是乱在长代码没分行
而且,如果不是验证ip合法根本无需那么长的表达式
最后,楼主的1#的已解决方案肯定是错的
发表于 2016-4-12 17:15:31 | 显示全部楼层
回复 11# afan


    他的解决方案明显原字符丢了一个\D
发表于 2016-4-12 17:16:50 | 显示全部楼层
回复  afan


    他的解决方案明显原字符丢了一个\D
haijie1223 发表于 2016-4-12 17:15



    猜错~  继续
发表于 2016-4-12 17:19:05 | 显示全部楼层
回复 13# afan


    小弟愚钝,还请afan指点。
发表于 2016-4-12 17:21:32 | 显示全部楼层
回复  afan


    小弟愚钝,还请afan指点。
haijie1223 发表于 2016-4-12 17:19



    我还是没细看  发哥先用最多两行说明楼主要把啥替换成啥
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 02:51 , Processed in 0.084425 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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