* A new output argument to the function regexp has been added to retrieve 15/9515/3
Sylvestre Ledru [Wed, 24 Oct 2012 01:12:45 +0000 (03:12 +0200)]
  subpatterns matches. See SEP #86.

Change-Id: I9b4c28109c97acaa861c7de35bb699f940086187

SEP/INDEX
SEP/SEP_086_regexp_improvement.odt [new file with mode: 0644]
scilab/CHANGES_5.4.X
scilab/modules/string/help/en_US/regexp.xml
scilab/modules/string/tests/unit_tests/regexp.dia.ref
scilab/modules/string/tests/unit_tests/regexp.tst

index 434fe8e..ee69de4 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -82,3 +82,4 @@ SEP #082: eigs function
 SEP #083: example_run function
 SEP #084: fft improvements
 SEP #085: cond improvements
+SEP #086: Improvement of the regexp function
\ No newline at end of file
diff --git a/SEP/SEP_086_regexp_improvement.odt b/SEP/SEP_086_regexp_improvement.odt
new file mode 100644 (file)
index 0000000..6f691fa
Binary files /dev/null and b/SEP/SEP_086_regexp_improvement.odt differ
index 45c24b4..7c31344 100644 (file)
@@ -7,6 +7,9 @@ Improvements
 
 * A warning has been added for 1./x and 1.\x syntax clarification.
 
+* A new output argument has been added to the function regexp to retrieve
+  subpatterns matches. See SEP #86.
+
 
 Xcos
 =====
index c900ea5..a2fe4b4 100644 (file)
@@ -23,6 +23,7 @@
             [start,end,match]=regexp(input,pattern,[flag])
             [start,end]=regexp(input,pattern,[flag])
             [start,end,match]=regexp(input,pattern,[flag])
+            [start,end,match,foundString]=regexp(input,pattern,[flag])
         </synopsis>
     </refsynopsisdiv>
     <refsection>
                 </listitem>
             </varlistentry>
             <varlistentry>
+                <term>foundString</term>
+                <listitem>
+                    <para>
+                        The captured parenthesized <literal>subpatterns</literal>.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
                 <term>[flag]</term>
                 <listitem>
                     <para>'o' for matching the pattern once .</para>
@@ -94,6 +103,27 @@ regexp('a!','/((((((((((a))))))))))\041/')
 regexp('ABCC','/^abc$/i')
 regexp('ABC','/ab|cd/i')
 [a b c]=regexp('XABYABBBZ','/ab*/i')
+
+piString="3.14"
+[a,b,c,piStringSplit]=regexp(piString,"/(\d+)\.(\d+)/")
+disp(piStringSplit(1))
+disp(piStringSplit(2))
+
+[a,b,c,d]=regexp('xabyabbbz','/ab(.*)b(.*)/')
+size(d)
+
+
+
+// get host name from URL
+myURL="http://www.scilab.org/download/";
+[a,b,c,d]=regexp(myURL,'@^(?:http://)?([^/]+)@i')
+
+
+str='foobar: 2012';
+// Using named subpatterns
+[a,b,c,d]=regexp(str,'/(?P<name>\w+): (?P<digit>\d+)/')
+d(1)=="foobar"
+d(2)=="2012"
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -104,4 +134,14 @@ regexp('ABC','/ab|cd/i')
             </member>
         </simplelist>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.4.10</revnumber>
+                <revremark>A new output argument, foundString, has been added to retrieve subpatterns matches.</revremark>
+            </revision>
+        </revhistory>
+    </refsection>
+    
 </refentry>
index f15fc83..d34c06a 100644 (file)
@@ -5,9 +5,9 @@
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 // <-- CLI SHELL MODE -->
-//========================================================================================
+//===================================================================
 // unit tests regexp
-//========================================================================================
+//===================================================================
 lf = ascii(10);
 if regexp('abc','/abc/','o') <>  1 then bugmes();quit;end
 ierr = execstr("regexp(''abc'',''/abc/'',''r'');","errcatch");
@@ -19,7 +19,7 @@ if size(start_pos,'*') <> 1 then bugmes();quit;end
 if size(end_pos,'*') <> 1 then bugmes();quit;end
 if start_pos <> 1 then bugmes();quit;end
 if end_pos <> 2 then bugmes();quit;end
-//========================================================================================
+//===================================================================
 if regexp('abc'                                     ,'/abc/'                                 ) <>  1   then bugmes();quit;end
 if regexp('xbc'                                     ,'/abc/'                                 ) <>  []  then bugmes();quit;end
 if regexp('axc'                                     ,'/abc/'                                 ) <>  []  then bugmes();quit;end
@@ -308,7 +308,7 @@ if regexp('aaab'                                    ,'/(?>a+)b/'
 if regexp('abc'                                     ,'/[a[:]b[:c]/'                          ) <>  1   then bugmes();quit;end
 if regexp('abc'                                     ,'/[a[:]b[:c]/'                          ) <>  1   then bugmes();quit;end
 if regexp('((abc(ade)ufh()()x'                      ,'/((?>[^()]+)|\([^()]*\))+/'            ) <>  3   then bugmes();quit;end
-//========================================================================================
+//===================================================================
 if regexp('a'+lf+'b'+lf                             ,'/a\Z/'                                 ) <>  []  then bugmes();quit;end
 if regexp('a'+lf+'b'+lf                             ,'/a\z/'                                 ) <>  []  then bugmes();quit;end
 if regexp('a'+lf+'b'+lf                             ,'/a$/'                                  ) <>  []  then bugmes();quit;end
@@ -480,7 +480,7 @@ if regexp('......abef'                              ,'/.*a(?!(b|cd)*e).*f/'
 if regexp('fools'                                   ,'/(foo|fool|x.|money|parted)$/'         ) <>  []  then bugmes();quit;end
 if regexp('fools'                                   ,'/(x.|foo|fool|x.|money|parted|y.)$/'   ) <>  []  then bugmes();quit;end
 if regexp('fools'                                   ,'/(foo|fool|money|parted)$/'            ) <>  []  then bugmes();quit;end
-//========================================================================================
+//===================================================================
 if regexp('scilab-5.0'            ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then bugmes();quit;end
 if regexp('scilab-5.0.1'          ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then bugmes();quit;end
 if regexp('scilab-5.0-alpha-1'    ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then bugmes();quit;end
@@ -488,7 +488,7 @@ if regexp('scilab-5.0-alpha1'     ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-
 if regexp('scilab-5.0-rc1'        ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then bugmes();quit;end
 if regexp('scilab-5.0-rc-1'       ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> [] then bugmes();quit;end
 if regexp('scilab-SE-trunk-27490' ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> [] then bugmes();quit;end
-//========================================================================================
+//===================================================================
 // Chinese
 str = '世界您好';
 [s,e,m] = regexp(str,'/您好$/');
@@ -511,7 +511,7 @@ if part(str,s:e) <> m then bugmes();quit;end
 if s <> [] then bugmes();quit;end
 if e <> [] then bugmes();quit;end
 if m <> '' then bugmes();quit;end
-//========================================================================================
+//===================================================================
 // Russian
 str = 'привет мир';
 [s,e,m] = regexp(str,'/^привет/');
@@ -532,7 +532,7 @@ if part(str,s:e) <> m then bugmes();quit;end
 if s <> [] then bugmes();quit;end
 if e <> [] then bugmes();quit;end
 if m <> '' then bugmes();quit;end
-//========================================================================================
+//===================================================================
 // Cyrilic
 str = 'АБВГДЄЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ';
 [s,e,m] = regexp(str,'/^АБВГДЄЖЅЗИІКЛМНОПҀР/');
@@ -553,7 +553,7 @@ if part(str,s:e) <> m then bugmes();quit;end
 if s <> [] then bugmes();quit;end
 if e <> [] then bugmes();quit;end
 if m <> '' then bugmes();quit;end
-//========================================================================================
+//===================================================================
 // Japanese
 str = '丑丞串乃之乎也云亘亙些亦亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃';
 [s,e,m] = regexp(str,'/^丑丞串乃之乎也云亘亙些亦/');
@@ -574,7 +574,7 @@ if part(str,s:e) <> m then bugmes();quit;end
 if s <> [] then bugmes();quit;end
 if e <> [] then bugmes();quit;end
 if m <> '' then bugmes();quit;end
-//========================================================================================
+//===================================================================
 // Thaï
 str = 'มกระดุกกระดิก';
 [s,e,m] = regexp(str,'/^มกระดุกกร/');
@@ -595,4 +595,20 @@ if part(str,s:e) <> m then bugmes();quit;end
 if s <> [] then bugmes();quit;end
 if e <> [] then bugmes();quit;end
 if m <> '' then bugmes();quit;end
-//========================================================================================
+//===================================================================
+// Subpatterns
+piString="3.14";
+[a,b,c,piStringSplit]=regexp(piString,"/(\d+)\.(\d+)/");
+assert_checkequal(piStringSplit(1),"3");
+assert_checkequal(piStringSplit(2),"14");
+[a,b,c,d]=regexp('xabyabbbz','/ab(.*)b(.*)/');
+assert_checkequal(size(d), [1, 2]);
+// get host name from URL
+myURL="http://www.scilab.org/download/";
+[a,b,c,d]=regexp(myURL,'@^(?:http://)?([^/]+)@i');
+assert_checkequal(d,"www.scilab.org");
+str='foobar: 2012';
+// Using named subpatterns
+[a,b,c,d]=regexp(str,'/(?P<name>\w+): (?P<digit>\d+)/');
+assert_checkequal(d(1),"foobar");
+assert_checkequal(d(2),"2012");
index 7a1cbb6..be38116 100644 (file)
@@ -5,9 +5,9 @@
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 // <-- CLI SHELL MODE -->
-//======================================================================================== 
+//===================================================================
 // unit tests regexp
-//======================================================================================== 
+//===================================================================
 lf = ascii(10);
 if regexp('abc','/abc/','o') <>  1 then pause,end
 ierr = execstr("regexp(''abc'',''/abc/'',''r'');","errcatch");
@@ -19,7 +19,7 @@ if size(start_pos,'*') <> 1 then pause,end
 if size(end_pos,'*') <> 1 then pause,end
 if start_pos <> 1 then pause,end
 if end_pos <> 2 then pause,end
-//======================================================================================== 
+//===================================================================
 if regexp('abc'                                     ,'/abc/'                                 ) <>  1   then pause,end
 if regexp('xbc'                                     ,'/abc/'                                 ) <>  []  then pause,end
 if regexp('axc'                                     ,'/abc/'                                 ) <>  []  then pause,end
@@ -308,7 +308,7 @@ if regexp('aaab'                                    ,'/(?>a+)b/'
 if regexp('abc'                                     ,'/[a[:]b[:c]/'                          ) <>  1   then pause,end
 if regexp('abc'                                     ,'/[a[:]b[:c]/'                          ) <>  1   then pause,end
 if regexp('((abc(ade)ufh()()x'                      ,'/((?>[^()]+)|\([^()]*\))+/'            ) <>  3   then pause,end
-//======================================================================================== 
+//===================================================================
 if regexp('a'+lf+'b'+lf                             ,'/a\Z/'                                 ) <>  []  then pause,end
 if regexp('a'+lf+'b'+lf                             ,'/a\z/'                                 ) <>  []  then pause,end
 if regexp('a'+lf+'b'+lf                             ,'/a$/'                                  ) <>  []  then pause,end
@@ -480,7 +480,7 @@ if regexp('......abef'                              ,'/.*a(?!(b|cd)*e).*f/'
 if regexp('fools'                                   ,'/(foo|fool|x.|money|parted)$/'         ) <>  []  then pause,end
 if regexp('fools'                                   ,'/(x.|foo|fool|x.|money|parted|y.)$/'   ) <>  []  then pause,end
 if regexp('fools'                                   ,'/(foo|fool|money|parted)$/'            ) <>  []  then pause,end
-//======================================================================================== 
+//===================================================================
 if regexp('scilab-5.0'            ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then pause,end
 if regexp('scilab-5.0.1'          ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then pause,end
 if regexp('scilab-5.0-alpha-1'    ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then pause,end
@@ -488,7 +488,7 @@ if regexp('scilab-5.0-alpha1'     ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-
 if regexp('scilab-5.0-rc1'        ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> 1  then pause,end
 if regexp('scilab-5.0-rc-1'       ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> [] then pause,end
 if regexp('scilab-SE-trunk-27490' ,'/^scilab-[5-9].[0-9](.[0-9])?(-(alpha-|beta-|rc)([0-9])?)?$/') <> [] then pause,end
-//======================================================================================== 
+//===================================================================
 // Chinese
 str = '世界您好';
 [s,e,m] = regexp(str,'/您好$/');
@@ -517,7 +517,7 @@ if part(str,s:e) <> m then pause,end
 if s <> [] then pause,end
 if e <> [] then pause,end
 if m <> '' then pause,end
-//======================================================================================== 
+//===================================================================
 // Russian
 str = 'привет мир';
 [s,e,m] = regexp(str,'/^привет/');
@@ -543,7 +543,7 @@ if part(str,s:e) <> m then pause,end
 if s <> [] then pause,end
 if e <> [] then pause,end
 if m <> '' then pause,end
-//======================================================================================== 
+//===================================================================
 // Cyrilic
 str = 'АБВГДЄЖЅЗИІКЛМНОПҀРСТѸФХѠЦЧШЩЪЪІЬѢЮѦѨѪѬѮѰѲѴѤ';
 
@@ -570,7 +570,7 @@ if part(str,s:e) <> m then pause,end
 if s <> [] then pause,end
 if e <> [] then pause,end
 if m <> '' then pause,end
-//======================================================================================== 
+//===================================================================
 // Japanese
 str = '丑丞串乃之乎也云亘亙些亦亥亨亮仔伊伎伍伽佃佑伶侃侑俄侠俣俐侶倭俺倶倦倖偲僅傭儲允兎兜其冥冴冶凄凌凜凛凧凪凰凱函刹劉劫勁勃';
 
@@ -597,7 +597,7 @@ if part(str,s:e) <> m then pause,end
 if s <> [] then pause,end
 if e <> [] then pause,end
 if m <> '' then pause,end
-//======================================================================================== 
+//===================================================================
 // Thaï
 str = 'มกระดุกกระดิก';
 [s,e,m] = regexp(str,'/^มกระดุกกร/');
@@ -623,6 +623,28 @@ if part(str,s:e) <> m then pause,end
 if s <> [] then pause,end
 if e <> [] then pause,end
 if m <> '' then pause,end
-//======================================================================================== 
+//===================================================================
+
+// Subpatterns
+
+piString="3.14";
+[a,b,c,piStringSplit]=regexp(piString,"/(\d+)\.(\d+)/");
+assert_checkequal(piStringSplit(1),"3");
+assert_checkequal(piStringSplit(2),"14");
+
+[a,b,c,d]=regexp('xabyabbbz','/ab(.*)b(.*)/');
+assert_checkequal(size(d), [1, 2]);
+
+
+
+// get host name from URL
+myURL="http://www.scilab.org/download/";
+[a,b,c,d]=regexp(myURL,'@^(?:http://)?([^/]+)@i');
+assert_checkequal(d,"www.scilab.org");
+
+str='foobar: 2012';
+// Using named subpatterns
+[a,b,c,d]=regexp(str,'/(?P<name>\w+): (?P<digit>\d+)/');
+assert_checkequal(d(1),"foobar");
+assert_checkequal(d(2),"2012");
 
\ No newline at end of file