1 #include <CtrlLib/CtrlLib.h>
2 #include <plugin/pcre/Pcre.h>
3
4 using namespace Upp;
5
6 #define LAYOUTFILE <RegExp2/RegExpExtDemoLayout.lay>
7 #include <CtrlCore/lay.h>
8
9 class mainwindowDlg : public Withmainwindow<TopWindow> {
10 typedef mainwindowDlg CLASSNAME;
11
12 public:
13 mainwindowDlg();
14 void RunRegExp();
clear_output()15 void clear_output(){t4.Clear();}
d1_callback()16 void d1_callback(){ Set_Examples((int)d1.GetData()); }
17 void Set_Examples(int i);
18
match_callback_fun(Vector<String> & v)19 void match_callback_fun(Vector<String>& v){
20 for(int i=0, i1=v.GetCount(); i<i1; i++)
21 v[i]=Format("Match%d",i+1);
22 }
23 };
24
mainwindowDlg()25 mainwindowDlg::mainwindowDlg()
26 {
27 CtrlLayout(*this, "RegExp Extension Demo");
28 Sizeable().Zoomable();
29 HCenterPos(800).VCenterPosZ(400);
30
31
32 for(int i=1; i<6; i++)
33 d1.Add(i, Format("TEST-%d",i));
34
35 d2.Add(1, "Disable Resolving Back-Reference")
36 .Add(2, "Enable Resolving Back-Reference")
37 .Add(3, "Use Callback Function");
38
39
40 d1<<=THISBACK(d1_callback);
41 b1<<=THISBACK(RunRegExp);
42 b2<<=THISBACK(clear_output);
43
44 d1.SetData(4);
45 d1_callback();
46
47 }
48
RunRegExp()49 void mainwindowDlg::RunRegExp()
50 {
51 RegExp regx;
52 RegExp reg("\\((.*?)\\)");
53
54 String t(t1.GetData());
55
56 int n=-101;
57
58
59 switch((int)d2.GetData()){
60
61 case 1: // no backref resolved
62
63 regx.SetPattern(t2.GetData());
64
65 if((int)o1.GetData() == 0)
66 n=regx.Replace(t, (String)t3.GetData());
67 else n=regx.ReplaceGlobal(t, (String)t3.GetData());
68
69 break;
70
71 case 2: // backref resolved
72
73 regx.SetPattern(t2.GetData());
74
75 if((int)o1.GetData() == 0)
76 n=regx.Replace(t, (String)t3.GetData(), true);
77 else n=regx.ReplaceGlobal(t, (String)t3.GetData(), true);
78
79 break;
80
81 case 3: // using callback funtion
82
83 regx.SetPattern(t2.GetData());
84
85 if((int)o1.GetData() == 0)
86 n=regx.Replace(t, THISBACK(match_callback_fun));
87 else n=regx.ReplaceGlobal(t, THISBACK(match_callback_fun));
88
89 break;
90 };
91
92
93
94 String output(t4.Get());
95
96 output
97 <<"Regular Expression:["<<t2.GetData()
98 <<"]\nReplacement Count="<<n
99 <<"\nInput: "<<t1.GetData()
100 <<"\nOutput: "<<t<<"\n\n\n";
101
102 t4.Set(output);
103 t4.ScrollEnd();
104 }
105
106
Set_Examples(int i)107 void mainwindowDlg::Set_Examples(int i)
108 {
109 switch(i){
110
111 case 1:
112 t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG") ;
113 t2.SetData("(\\w)");
114 t3.SetData("(#)");
115 d2.SetData(1);
116 break;
117
118 case 2:
119 t1.SetData("31-1-2000 13-2-2010 1-12-2012");
120 t2.SetData("(\\d+)-(\\d+)-(\\d+)");
121 t3.SetData("(\\2)(\\1)(\\3)");
122 d2.SetData(2);
123 o1.SetData(true);
124 break;
125
126 case 3:
127 t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG");
128 t2.SetData("(QUICK)");
129 t3.SetData("(SLOW)");
130 d2.SetData(1);
131 break;
132
133 case 4:
134 t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG");
135 t2.SetData("(QUICK)\\s+(BROWN)");
136 t3.SetData("(\\2ISH)(\\1)");
137 d2.SetData(2);
138 break;
139
140
141 case 5:
142 t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG");
143 t2.SetData("(\\w+)");
144 t3.SetData("THIS IS EXAMPLE OF THE USE OF CALLBACK FUNCTION");
145 d2.SetData(3);
146 break;
147 }
148
149 }
150
151
152
153 GUI_APP_MAIN
154 {
155 mainwindowDlg w;
156
157 w.Run();
158
159 }
160