实现了一个用于正则表达式处理的工具,通过热键 F6 快速获取选定的文本内容,然后在工具界面中进行正则匹配与替换操作,处理后的内容可以复制到剪贴板。

 

/*
正则文本处理工具v1.0
热键F6
by 城西修改  2021.8.19
功能:
  1.发送ctrl+c复制
  2.将结果数据传入工具
  3.可以在工具中正则处理
  4.最后将处理后的文本内容放入剪切板
*/


Clipboard=
Send,{Ctrl down}c{Ctrl up}
Sleep,200
Waitstr:=Clipboard

IfWinExist,正则文本处理工具v1.0
{
  GuiControl , ,_FileContent, %Waitstr%
  return
}


g_SelectedFile =			;这个值是什么不清楚

Gui, Add, Button, x6 y20 w100 h30  	g【打开】, 打开文件(&F)
Gui, Add, Edit, 	x146 y22 w410 h25  r3  	v_search g【正则表达式输入框】,				;-Multi
Gui, Add, Button, x556 y20 w80 h50 	g【匹配】, 匹配
Gui, Add, Edit, 	x686 y22 w300 h25 r3  	v_replace g【替换字符输入框】,		;-Multi
Gui, Add, Button, x986 y20 w80 h50 	g【替换】, 替换
Gui, Add, Button, x750 y75 w100 h25 	g【复制】, 复制结果内容
Gui, Add, Edit, 	x6 y108 w580 h550 	HScroll v_FileContent,%Waitstr%
Gui, Add, Edit, 	x596 y108 w510 h550  HScroll v_NewContent, 无匹配内容
Gui, Add, Text, 	x6 y80 w80 h20 , 原始文本
Gui, Add, Text, 	x596 y80 w80 h20 , 替换后文本

Gui, Add, Checkbox, x986 y75 w150 h20 v_OnlyRepalceMatch, 只替换有匹配的行
Gui, Add, Checkbox, x100 y75 w80 h20 v_MatchByLine, 逐行匹配

Gui, Add, Checkbox, x200 y75 w120 h20 v_MatchAll, 匹配全部>连接符
Gui, Add, Edit, 	x320 y72 w80 h25  r2 cred v_linkstr,>				;-Multi

Gui, Add, Button, x486 y72 w70 h22 g【重新加载】, Reload(&R)
; Generated using SmartGUI Creator 4.0
Gui, Show, x161 y206 h650 w1114, 正则文本处理工具v1.0
Return

GuiClose:
gui,Destroy
return


【打开】:
FileSelectFile, g_SelectedFile, 3, , 选择需要分析的日志文件,
if g_SelectedFile <>
{
  FileRead var_temp, %g_SelectedFile%
  GuiControl , , _FileContent, %var_temp%
}

Return

【正则表达式输入框】:
Gosub 【匹配】
Return

【匹配】:
Gui, submit, NoHide
_p子模式=
if (RegExMatch(_search,"<(\d+)>$") > 0)
{
  _p子模式:=RegExReplace(_search,"[\s\S]*?<(\d+)>$","$1")		;将末尾的<1234> 数字识别为子模式
  _search:=RegExReplace(_search,"<\d+>$")
}

if _MatchAll				;匹配-1次
{
  if  _search <>
  {
    MatchBuf =
    MatchBuf2 =
    if _MatchByLine
    {
      Loop parse, _FileContent, `n,`r
      {
        MatchBuf2 =
        _zArray :=RegExMatchAll(A_LoopField,_search,-1,_p子模式)
        if _zArray
        {
          for k,v in _zArray
          {
            if (MatchBuf2 <> "")
              MatchBuf2 :=MatchBuf2 . _linkstr . v
            else
              MatchBuf2 :=v
          }
        }
        MatchBuf .=(MatchBuf<>"") ? "`n" MatchBuf2 : MatchBuf2
      }
    }
    else
    {
      _zArray :=RegExMatchAll(_FileContent,_search,-1,_p子模式)
      if _zArray
      {
        for k,v in _zArray
        {
          if (MatchBuf2 <> "")
            MatchBuf2 :=MatchBuf2 . _linkstr . v
          else
            MatchBuf2 :=v
        }
      }
      MatchBuf :=MatchBuf2
    }
    GuiControl , , _NewContent, %MatchBuf%
  }
  Else
    GuiControl , , _NewContent,
  Return
}
else						;匹配1次
{
  if  _search <>
  {
    MatchBuf =
    MatchBuf2 =
    if _MatchByLine
    {
      Loop parse, _FileContent, `n,`r
      {
        MatchBuf2 =
        _zArray :=RegExMatchAll(A_LoopField,_search,,_p子模式)
        if _zArray
        {
          for k,v in _zArray
          {
              MatchBuf2 :=v
          }
        }
        MatchBuf .=(MatchBuf<>"") ? "`n" MatchBuf2 : MatchBuf2
      }
    }
    else
    {
      _zArray :=RegExMatchAll(_FileContent,_search,,_p子模式)
      if _zArray
      {
        for k,v in _zArray
        {
            MatchBuf2 :=v
        }
      }
      MatchBuf :=MatchBuf2
    }
    GuiControl , , _NewContent, %MatchBuf%
  }
  Else
    GuiControl , , _NewContent,
  Return
}
return


【替换字符输入框】:
Return

【替换】:
Gui, submit, NoHide
if _search <>
{
  MatchBuf =
  if _MatchByLine
  {
    Loop parse, _FileContent, `n,`r
    {
      if ( !_OnlyRepalceMatch || RegExMatch( A_LoopField, _search ) > 0 )
      {
        var_match := RegExReplace( A_LoopField, _search, _replace )
        {
          MatchBuf .= var_match "`n"
        }
      }
    }
  }
  else
  {
    if ( !_OnlyRepalceMatch || RegExMatch( _FileContent, _search ) > 0 )
    {
      var_match := RegExReplace( _FileContent, _search, _replace )
      {
    ;	msgbox  RegExReplace( _FileContent`, %_search%`, %_replace% )`n`n%var_match%
        MatchBuf := var_match
      }
    }
  }
  GuiControl , , _NewContent, %MatchBuf%
}
Else
  GuiControl , , _NewContent,
Return

【重新加载】:
Reload
Return


【复制】:
gui,Submit,NoHide
Clipboard :=_NewContent
ToolTip,复制到剪切板完成!
SetTimer, ffzwjc,-1000
Return
ffzwjc:
ToolTip
return



RegExMatchAll(str, re, max_num:=1, re_num="") {				
arr:=[], pos:=0, r:="",nc:=1
if max_num <>-1	
{
While (pos:=RegExMatch(str, re, r, pos+StrLen(r)+!StrLen(r))) and (nc<=max_num)			
{
arr.Push( r%re_num% )
nc++
}
return, arr.MaxIndex() ? arr : ""
}							
While (pos:=RegExMatch(str, re, r, pos+StrLen(r)+!StrLen(r)))
arr.Push( r%re_num% )
return, arr.MaxIndex() ? arr : ""
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。