如何替换一段文字中某些文字为同样数量的另一些文字? Topic is solved

遇到了问题?请先进行搜索(中文和英文),然后在此提问

Moderators: tmplinshi, arcticir

jklop000
Posts: 4
Joined: 04 Apr 2021, 03:21
Contact:

如何替换一段文字中某些文字为同样数量的另一些文字?

Post by jklop000 » 04 Apr 2021, 03:45

比如有以下一段文字:
爱财如命——(挥金如土) 异口同声——(众说纷纭)
爱不释手——(弃若屐) 半途而废——(坚持懈)
一丝——(大叶) 古今——(坐天)

现在,我想将像“(挥金如土)”,这样结构的括号内的文字变成“(空空空空)”,按这个想法替换正确应该是下面这样:
爱财如命——(空空空空) 异口同声——(空空空空)
爱不释手——(空空空) 半途而废——(空空空)
一丝——(空空) 古今——(空空)

试了通过正则表达式,没有找到好的办法,有高人能指点一下吗?
sanmaodo
Posts: 45
Joined: 28 Aug 2020, 01:39

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by sanmaodo » 04 Apr 2021, 09:29

这是一个笨拙的方法,希望能给你一点启发

Code: Select all

text := "爱财如命——(挥金如土) 异口同声——(众说纷纭)"
      . "爱不释手——(弃若屐) 半途而废——(坚持懈)"
      . "一丝——(大叶) 古今——(坐天)"

re := ["空", "空空", "空空空", "空空空空"]

while RegExMatch(text, "(?<=()[^()空\x00-\xff]*(?=))", str) > 0
{
  text := RegExReplace(text, "(?<=()[^()空\x00-\xff]*(?=))", re[StrLen(str)], , 1)
  msgbox % text
}
feiyue
Posts: 348
Joined: 08 Aug 2014, 04:08

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?  Topic is solved

Post by feiyue » 04 Apr 2021, 10:55

可以这样做:

Code: Select all

text := "爱财如命——(挥金如土) 异口同声——(众说纷纭)"
      . "爱不释手——(弃若屐) 半途而废——(坚持懈)"
      . "一丝——(大叶) 古今——(坐天)"

;-- 生成100个 “空” 字符
s:=StrReplace(Format("{:0100d}",0), "0", "空")

;-- 先收集所有需要替换的内容,暂时不替换
arr:=[], p:=1, r:=""
While p:=RegExMatch(text, "((.+?))", r, p+StrLen(r))
  arr[r]:="(" SubStr(s,1,StrLen(r1)) ")"

;-- 统一进行替换
For k,v in arr
  text:=StrReplace(text, k, v)
msgbox % text
sanmaodo
Posts: 45
Joined: 28 Aug 2020, 01:39

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by sanmaodo » 04 Apr 2021, 11:06

@feiyue 学到知识了,感谢!!! :D
sikongshan
Posts: 17
Joined: 06 Jul 2019, 21:57

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by sikongshan » 06 Apr 2021, 03:47

我也来一个

Code: Select all

text := "爱财如命——(挥金如土) 异口同声——(众说纷纭)"
      . "爱不释手——(弃若屐) 半途而废——(坚持空懈) 半途而废——(坚持懈)"
      . "一丝——(大叶) 古今——(坐天)古今——(坐空空天空空)"

Loop
{
	kong.="空",	text:=RegExReplace(text,"(.{" A_Index "})","【" kong "】")  ;找到一两个文本里面没用到的符号临时用,比如此处用的【】
	if not (regexmatch(text,"(.+)"))  ;如果没有匹配了,则退出
		break
}
text:=StrReplace(text,"【","("),text:=StrReplace(text,"】",")")
MsgBox %text%
sanmaodo
Posts: 45
Joined: 28 Aug 2020, 01:39

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by sanmaodo » 06 Apr 2021, 09:07

@sikongshan
这一句好给力,我又学到一招,谢谢!

Code: Select all

text:=RegExReplace(text,"(.{" A_Index "})","【" kong "】")
期待更多的方法 :clap:
sikongshan
Posts: 17
Joined: 06 Jul 2019, 21:57

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by sikongshan » 08 Apr 2021, 05:10

:D 请教了一下正则达人相关正则,可以精简一下,省掉替换步骤:

Code: Select all

Loop
	text:=RegExReplace(text,"([^()]{" A_index "})","(" (kong.="空") ")")
until not regexmatch(text,"([^()]*[^空()]+[^()]*)")
MsgBox %text%
sanmaodo
Posts: 45
Joined: 28 Aug 2020, 01:39

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by sanmaodo » 08 Apr 2021, 08:32

@sikongshan 更加强大了! :beer:
jklop000
Posts: 4
Joined: 04 Apr 2021, 03:21
Contact:

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by jklop000 » 09 Apr 2021, 19:28

非常感谢以上几位世外高人的指点!!非常感谢!!!
jklop000
Posts: 4
Joined: 04 Apr 2021, 03:21
Contact:

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by jklop000 » 09 Apr 2021, 20:44

@sikongshan 非常感谢!!不过有个小问题,就是kong这个变量要在Loop前清空一次,不然多次替换的时候会出现多个“空空空空……”
sikongshan
Posts: 17
Joined: 06 Jul 2019, 21:57

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by sikongshan » 10 Apr 2021, 07:00

jklop000 wrote:
09 Apr 2021, 20:44
@sikongshan 非常感谢!!不过有个小问题,就是kong这个变量要在Loop前清空一次,不然多次替换的时候会出现多个“空空空空……”
是的,在每个Loop前必须加一个清空
User avatar
miozus
Posts: 15
Joined: 08 Sep 2021, 21:53

Re: 如何替换一段文字中某些文字为同样数量的另一些文字?

Post by miozus » 08 Sep 2021, 23:26

Code: Select all

;=====================================================================o
;                    Vscode Macro
;---------------------------------------------------------------------o
trimNumber() {
    ; vim focus last cursor, use regex to replace
    WinActivate, ahk_exe Code.exe
    sleep, 100
    send, {text}mr
    sleep, 100
    send, ^r
    send, !r                         ; activate regex
    sleep, 100
    send, {text}^(\d.?[. ]?)+
    send, {Tab}
    send, {Lshift down}{Home}{Lshift up}{Del}
    sleep, 100
    send, ^!{Enter}
    send, {Esc}
    sleep, 200
    send, {text}'r
}
;---------------------------------------------------------------------o

案例来自实际。

提供另一种思路:

手头正好有 VsCode,充分利用它的查找和正则匹配的功能,将文字段落拷贝进里面,用 AHK 按快捷键处理。

同样,没有正则,你也可以放进 Word 处理。

你觉得简单能理解就好。

:happybday:
Post Reply

Return to “请求帮助”