【aardio实战】制作正则表达式测试工具-模式匹配、文本分析论坛-aardio-阿甘软件

【aardio实战】制作正则表达式测试工具

参考菜鸟工具——正则表达式在线测试:https://c.runoob.com/front-end/854/

准备用 aardio 做一个自用的正则工具,效果图如下:

image

main窗口

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
mainForm = win.form(text="Release-RE";right=799;bottom=591;bgcolor=16777215;border="none")
mainForm.add(
caption={cls="bkplus";text="Release-RE";left=35;top=0;right=160;bottom=32;color=16777215;dl=1;dt=1;font=LOGFONT(h=-16;weight=700);z=5};
custom={cls="custom";left=0;top=32;right=800;bottom=592;bgcolor=16250613;db=1;dl=1;dr=1;dt=1;z=1};
logo={cls="bkplus";text='\uF085';left=6;top=0;right=35;bottom=32;color=16777215;dl=1;dt=1;font=LOGFONT(h=-18;name='FontAwesome');z=4};
navFirst={cls="plus";text="正则";left=166;top=0;right=260;bottom=32;align="left";color=16777215;dl=1;dt=1;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-19;name='FontAwesome');padding={left=12;top=4}};iconText='\uF00A';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=3};
navHelp={cls="plus";text="去重";left=260;top=0;right=354;bottom=32;align="left";color=16777215;dl=1;dt=1;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-19;name='FontAwesome');padding={left=12;top=4}};iconText='\uF06A';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=6};
plus_setTop={cls="plus";left=667;top=0;right=704;bottom=32;border={radius=4};color=16777215;dr=1;dt=1;font=LOGFONT(h=-14;name='Microsoft YaHei UI');iconStyle={font=LOGFONT(h=-24;name='FontAwesome');valign="bottom"};iconText='\uF204';notify=1;textPadding={left=15};valign="bottom";z=7};
titleBar={cls="bkplus";left=0;top=0;right=800;bottom=32;bgcolor=4079166;dl=1;dr=1;dt=1;forecolor=5720388;linearGradient=30;z=2}
)
/*}}*/

import win.ui.simpleWindow;
var simple_win = win.ui.simpleWindow( mainForm,20,32,32,32);
simple_win.skin(
    background = { 
        hover = 0xFFE8E8E8;
        active = 0xffff6666; 
        default = 0x00000000; 
    }
    color = { 
        hover = 0xFF4A4A4A;
        active = 0xffffffff; 
        default = 0xffffffff; 
    }
)

import win.ui.tabs;
var tbs = win.ui.tabs( 
    mainForm.navFirst,
    mainForm.navHelp
);
    
tbs.skin(
    foreground={
        active=0xFFFFFFFF;
        default=0x00FFFFFF;
        hover=0x38FFFFFF
    };
    color={
        default=0xFFFFFFFF; 
    };
    checked={
        foreground={default=0xFFFFFFFF;}; 
        color={default=0xFF3E3F40;};
    }
)
    
tbs.loadForm(1,"\dlg\first.aardio" );  
tbs.loadForm(2,"\dlg\dedup.aardio" ); 
tbs.selIndex = 1; 

import win.ui.tooltip; 
//在所有者窗口 winform 上创建 tooltip 提示控件 
var balloonTipCtrl = win.ui.tooltip.tracking(mainForm,false);
mainForm.plus_setTop.onMouseEnter = function(wParam,lParam){ 
    var x,y,cx,cy = mainForm.plus_setTop.getPos(true);
    //手动显示提示
    if(mainForm.plus_setTop.checked){
        balloonTipCtrl.setText("取消置顶").trackPopup(true,x+20,y+cy );
    }
    else {
        balloonTipCtrl.setText("置顶").trackPopup(true,x+20,y+cy );
    }
}

mainForm.plus_setTop.onMouseLeave = function(wParam,lParam){ 
    balloonTipCtrl.trackPopup(false); //手动关闭提示
}

mainForm.plus_setTop.skin({
    checked = {
        iconText = '\uF205';
    } 
})

mainForm.plus_setTop.oncommand = function(id,event){
    win.setTopmost(mainForm.hwnd,mainForm.plus_setTop.checked);
    mainForm.plus_setTop.onMouseEnter()
}

mainForm.show();
return win.loopMessage();

tab子窗口

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="设置";right=1199;bottom=759;bgcolor=16777215)
winform.add(
btn_regexFun={cls="plus";text='\uF024  修饰符 \uF0D7';left=1067;top=55;right=1181;bottom=98;bgcolor=16777215;border={color=-12697798;radius=4;width=1};dr=1;dt=1;font=LOGFONT(h=-16;name='FontAwesome');notify=1;tabstop=1;z=3};
edit_input={cls="richedit";left=20;top=124;right=1175;bottom=330;color=5722185;db=0.57;dl=1;dr=1;dt=1;font=LOGFONT(h=-14;name='Microsoft YaHei UI');multiline=1;vscroll=1;wrap=1;z=7};
edit_output={cls="richedit";left=24;top=360;right=1173;bottom=737;bgcolor=15791608;color=5722185;db=1;dl=1;dr=1;dt=0.47;font=LOGFONT(h=-14;name='Microsoft YaHei UI');multiline=1;vscroll=1;wrap=1;z=5};
edit_regex={cls="edit";left=83;top=63;right=983;bottom=91;color=8936754;dl=1;dr=1;dt=1;font=LOGFONT(h=-19;name='Microsoft YaHei UI';weight=700);multiline=1;z=9};
plus={cls="plus";left=15;top=115;right=1182;bottom=338;border={color=-3222310;radius=3;width=2};db=0.56;dl=1;dr=1;dt=1;z=6};
plus5={cls="plus";left=15;top=353;right=1182;bottom=746;bgcolor=15791608;border={color=-3222310;radius=3;width=2};db=1;dl=1;dr=1;dt=0.46;z=4};
plus6={cls="plus";left=68;top=55;right=995;bottom=98;border={color=-3222310;width=1};dl=1;dr=1;dt=1;z=8};
plus_regexLeft={cls="plus";text="/";left=14;top=55;right=73;bottom=98;bgcolor=15791608;border={color=-3222310;radius=3;width=1};dl=1;dt=1;font=LOGFONT(h=-19;name='Microsoft YaHei UI';weight=700);textPadding={left=16;top=8;right=16;bottom=8};valign="top";z=1};
plus_regexRight={cls="plus";text="/g";left=991;top=55;right=1056;bottom=98;bgcolor=15791608;border={color=-3222310;radius=3;width=1};dr=1;dt=1;font=LOGFONT(h=-19;name='Microsoft YaHei UI';weight=700);textPadding={left=16;top=8;right=16;bottom=8};valign="top";z=2};
static={cls="static";text="正则筛选 Release Note";left=14;top=8;right=295;bottom=48;center=1;font=LOGFONT(h=-19;name='Microsoft YaHei UI';weight=700);transparent=1;z=11};
static_error={cls="static";text='\uF00D';left=11;top=56;right=51;bottom=96;align="center";center=1;color=255;font=LOGFONT(h=-24;name='FontAwesome');hide=1;notify=1;transparent=1;z=10}
)
/*}}*/

import style; 
//winform.btn_regexFun.skin(style.primaryButton); 
winform.btn_regexFun.skin(        
    background={
        active=0xFF4A4A4A;
        default=3300744;
        hover=0xFF4A4A4A
    };
    foreground={
        hover=0xFF3E3F3A
    };
    color={
        active=0xFFFFFFFF;
        hover=0xFFFFFFFF
    }
)
import preg;
import console;

winform.edit_regex.text = "(?<=[a-zA-Z0-9]{7}[ ]).+(?=\n|\r\n|$)"
winform.edit_input.text = /**20eaa4b JIRA_GAPP-1234: san.zhang_comm_fix: common-A01 aardio 变量传参给 Python 方法
f1419b1 jira_GAPP-9621: si.li_app__fix: common-项目配置
f1419b2 Merge "jira_GAPP-9621: si.li_app__fix: common-项目配置**/

winform.extraction = function(){
    var regex_str = winform.edit_regex.text;
    var regex = preg(regex_str);
    var check = true;
    //全局匹配
    winform.edit_output.text = null;
    try{
        for str in regex.gmatch(winform.edit_input.text) { 
            winform.edit_output.text += str;
        }
    }
    catch(e){
        check = false;
    }
    winform.static_error.hide = check;
}

winform.edit_regex.onChange = function(){ 
    if(owner.onModified)owner.onModified(true);
    winform.extraction();
}

winform.edit_input.onChange = function(){ 
    if(owner.onModified)owner.onModified(true);
    winform.extraction();
}

winform.show();
win.loopMessage();
return winform;

当前问题

  1. edit 控件文本概率性刷新问题(显示空白)
    ——已解决:plus 的 richedit 有点问题,如果使用长文本的编辑框就不建议使用plus来做
  2. 特定正则引起死循环:(?<=[a-zA-Z0-9]{7}[ ])

TODO

  1. 优化正则:不匹配包含以下字串的数据:Merge ” …… “。
  2. release note去重复:相同 id 只保留一条数据。
  3. 添加全局匹配、忽略大小写功能。

工程源代码下载

工程源码丢失,参考上述关键代码自行构建。

请登录后发表评论