hnfeng 发表于 2016-4-12 14:31:20

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

本帖最后由 hnfeng 于 2016-4-12 16:47 编辑

#include <Array.au3>

Global $t_RegExp = "\b(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\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=[["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,$a_IP_Add & " [" & $a_IP_Add & "]")
MsgBox(0,"替换111.111.111.1",$Text)

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

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



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

搞掂了:
$Text=StringRegExpReplace($Text,"\b" & $a_IP_Add & "\D",$a_IP_Add & " [" & $a_IP_Add & "]")

hnfeng 发表于 2016-4-12 14:32:21

看了 StringRegExpReplace 的帮助,不知道如何下手

zghwelcome 发表于 2016-4-12 15:04:04

相当有意思,别人花金币帮忙。坐等坛子里大佬们的回复{:face (356):}

hnfeng 发表于 2016-4-12 15:05:53

本帖最后由 hnfeng 于 2016-4-12 15:25 编辑

回复 3# zghwelcome


    不好意思,本来是想“悬赏”的,看错了
#include <Array.au3>
Global $t_RegExp = "\b(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\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=[["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,$a_IP_Add & " [" & $a_IP_Add & "]")
MsgBox(0,"替换111.111.111.1",$Text)
$Text=StringReplace($Text,$a_IP_Add,$a_IP_Add & " [" & $a_IP_Add & "]")
MsgBox(0,"替换111.111.111.11",$Text)
$Text=StringReplace($Text,$a_IP_Add,$a_IP_Add & " [" & $a_IP_Add & "]")
MsgBox(0,"替换111.111.111.111",$Text)

hnfeng 发表于 2016-4-12 16:01:09

StringRegExpReplace($Text, "\b111\.111\.111\.1\b", "new")
这样倒是可以,但是貌似 StringRegExpReplace 里面的正则表达式不支持 $xxxx 变量。

zghwelcome 发表于 2016-4-12 16:14:55

回复 5# hnfeng

A版的正则用的炉火纯青,无人能出其右

afan 发表于 2016-4-12 16:51:29

回复hnfeng

A版的正则用的炉火纯青,无人能出其右
zghwelcome 发表于 2016-4-12 16:14 http://www.autoitx.com/images/common/back.gif


    给我戴那么大顶帽子,亚历山大…
我只是个菜鸟。

afan 发表于 2016-4-12 16:53:59

这样倒是可以,但是貌似 StringRegExpReplace 里面的正则表达式不支持 $xxxx 变量。
hnfeng 发表于 2016-4-12 16:01 http://www.autoitx.com/images/common/back.gif


    因太乱 没细看!

估计 StringRegExpReplace($Text, "\b111\.111\.111\.1\b", "new")改为你说的变量
StringRegExpReplace($Text, '\Q' & $xxxx & '\E', "new") 即可

haijie1223 发表于 2016-4-12 17:02:08

我擦~看了好半天才看明白题意,是不是这样?
直接说 原字符 是什么,目标字符是什么。多么简单的事,非要复杂化。
#include <Array.au3>
Global $t_RegExp = "\b(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\.(?:|{2}|{2}|2|25)\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 = [["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 & "(\D)", $a_IP_Add & " [" & $a_IP_Add & "]\1")
MsgBox(0, "替换111.111.111.1", $Text)

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

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

haijie1223 发表于 2016-4-12 17:03:30

回复 8# afan


    确实是挺乱,老半天我都没看明白题意,猜着写的~吼吼~

afan 发表于 2016-4-12 17:11:47

回复afan


    确实是挺乱,老半天我都没看明白题意,猜着写的~吼吼~
haijie1223 发表于 2016-4-12 17:03 http://www.autoitx.com/images/common/back.gif

是的,主要是乱在长代码没分行
而且,如果不是验证ip合法根本无需那么长的表达式
最后,楼主的1#的已解决方案肯定是错的

haijie1223 发表于 2016-4-12 17:15:31

回复 11# afan


    他的解决方案明显原字符丢了一个\D

afan 发表于 2016-4-12 17:16:50

回复afan


    他的解决方案明显原字符丢了一个\D
haijie1223 发表于 2016-4-12 17:15 http://www.autoitx.com/images/common/back.gif


    猜错~继续

haijie1223 发表于 2016-4-12 17:19:05

回复 13# afan


    小弟愚钝,还请afan指点。

afan 发表于 2016-4-12 17:21:32

回复afan


    小弟愚钝,还请afan指点。
haijie1223 发表于 2016-4-12 17:19 http://www.autoitx.com/images/common/back.gif


    我还是没细看发哥先用最多两行说明楼主要把啥替换成啥 {:face (303):}
页: [1] 2 3
查看完整版本: 请教文本替换的问题(可能需要正则?) 已解决