annotate scripts/strings/strsplit.m @ 16712:9ce08a1efc29

fix strsplit input validation * strsplit.m: Fix input validation when called with no arguments.
author Mike Miller <mtmiller@ieee.org>
date Sat, 01 Jun 2013 00:30:20 -0400
parents d50bca1cdc22
children 3ce3579405f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14138
72c96de7a403 maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents: 13929
diff changeset
1 ## Copyright (C) 2009-2012 Jaroslav Hajek
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
2 ##
11104
2c356a35d7f5 fix copyright notices
John W. Eaton <jwe@octave.org>
parents: 8884
diff changeset
3 ## This file is part of Octave.
2c356a35d7f5 fix copyright notices
John W. Eaton <jwe@octave.org>
parents: 8884
diff changeset
4 ##
2c356a35d7f5 fix copyright notices
John W. Eaton <jwe@octave.org>
parents: 8884
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
8 ## your option) any later version.
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
9 ##
11104
2c356a35d7f5 fix copyright notices
John W. Eaton <jwe@octave.org>
parents: 8884
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
13 ## General Public License for more details.
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
14 ##
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
11104
2c356a35d7f5 fix copyright notices
John W. Eaton <jwe@octave.org>
parents: 8884
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
17 ## <http://www.gnu.org/licenses/>.
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
18
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
19 ## -*- texinfo -*-
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
20 ## @deftypefn {Function File} {[@var{cstr}] =} strsplit (@var{s})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
21 ## @deftypefnx {Function File} {[@var{cstr}] =} strsplit (@var{s}, @var{del})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
22 ## @deftypefnx {Function File} {[@var{cstr}] =} strsplit (@var{s}, @var{del}, @var{collapsedelimiters})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
23 ## @deftypefnx {Function File} {[@var{cstr}] =} strsplit (@dots{}, @var{name}, @var{value})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
24 ## @deftypefnx {Function File} {[@var{cstr}, @var{matches}] =} strsplit (@dots{})
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
25 ## Split the string @var{s} using the delimiters specified by @var{del}
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
26 ## and return a cell array of strings. For a single delimiter, @var{del}
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
27 ## may be a string, or a scalar cell-string. For multible delimiters,
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
28 ## @var{del} must be a cell-string array. Unless @var{collapsedelimiters} is
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
29 ## specified to be @var{false}, consecutive delimiters are collapsed into one.
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
30 ##
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
31 ## The second output, @var{matches}, returns the delmiters which were matched
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
32 ## in the original string. The matched delimiters are uneffected by the
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
33 ## @var{collapsedelimiters}.
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
34 ##
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
35 ## Example:
13929
9cae456085c2 Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents: 13776
diff changeset
36 ##
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
37 ## @example
13929
9cae456085c2 Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents: 13776
diff changeset
38 ## @group
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
39 ## strsplit ("a b c")
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
40 ## @result{}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
41 ## @{
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
42 ## [1,1] = a
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
43 ## [1,2] = b
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
44 ## [1,3] = c
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
45 ## @}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
46 ##
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
47 ## strsplit ("a,b,c", ",")
14327
4d917a6a858b doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
48 ## @result{}
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
49 ## @{
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
50 ## [1,1] = a
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
51 ## [1,2] = b
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
52 ## [1,3] = c
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
53 ## @}
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
54 ##
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
55 ## strsplit ("a foo b,bar c", @{"\s", "foo", "bar"@})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
56 ## @result{}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
57 ## @{
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
58 ## [1,1] = a
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
59 ## [1,2] = b
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
60 ## [1,3] = c
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
61 ## @}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
62 ##
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
63 ## strsplit ("a,,b, c", @{",", " "@}, false)
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
64 ## @result{}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
65 ## @{
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
66 ## [1,1] = a
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
67 ## [1,2] =
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
68 ## [1,3] = b
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
69 ## [1,4] =
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
70 ## [1,5] = c
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
71 ## @}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
72 ##
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
73 ## @end group
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
74 ## @end example
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
75 ##
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
76 ## Supported @var{name}/@var{value} pair arguments are;
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
77 ##
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
78 ## @itemize
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
79 ## @item @var{collapsedelimiters} may take the value of @var{true} or @var{false}
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
80 ## with the default being @var{false}.
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
81 ## @item @var{delimitertype} may take the value of @code{legacy},
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
82 ## @code{simple} or @code{regularexpression}.
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
83 ## If @var{delimitertype} is equal to @code{legacy}, each individual
16557
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
84 ## character of @var{del} is used to split the input. For both @code{simple}
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
85 ## and @code{regularexpression}, the string is split at the boundaries of the
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
86 ## delimiter string. If @var{delimiter} is a cell-string, then the string
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
87 ## is split at the boundaries of each of the cells' strings. @var{simple}
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
88 ## delimiters may contain escaped characters, but are otherwise treated as
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
89 ## literal strings.
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
90 ##
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
91 ## If the specified delimiters are single characters, the default is
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
92 ## @var{delimitertype} is @code{legacy}. Otherwise the default
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
93 ## @var{delimitertype} is @code{simple}.
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
94 ## @end itemize
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
95 ##
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
96 ## Example:
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
97 ##
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
98 ## @example
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
99 ## @group
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
100 ## strsplit ("a foo b,bar c", ",|\\s|foo|bar", "delimitertype", "regularexpression")
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
101 ## @result{}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
102 ## @{
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
103 ## [1,1] = a
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
104 ## [1,2] = b
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
105 ## [1,3] = c
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
106 ## @}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
107 ##
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
108 ## strsplit ("a,,b, c", "[, ]", false, "delimitertype", "regularexpression")
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
109 ## @result{}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
110 ## @{
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
111 ## [1,1] = a
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
112 ## [1,2] =
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
113 ## [1,3] = b
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
114 ## [1,4] =
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
115 ## [1,5] = c
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
116 ## @}
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
117 ##
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
118 ## strsplit ("a,,b, c", ", ", false, "delimitertype", "legacy")
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
119 ## @result{}
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
120 ## @{
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
121 ## [1,1] = a
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
122 ## [1,2] =
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
123 ## [1,3] = b
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
124 ## [1,4] =
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
125 ## [1,5] = c
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
126 ## @}
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
127 ##
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
128 ## strsplit ("a,\t,b, c", @{',', '\s'@}, "delimitertype", "regularexpression")
14327
4d917a6a858b doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
129 ## @result{}
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
130 ## @{
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
131 ## [1,1] = a
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
132 ## [1,2] = b
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
133 ## [1,3] = c
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
134 ## @}
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
135 ## @end group
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
136 ## @end example
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
137 ##
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
138 ## @seealso{strjoin, strtok, regexp}
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
139 ## @end deftypefn
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
140
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
141 function [result, matches] = strsplit (str, del, varargin)
8884
579de77acd90 strsplit.m: style fixes
John W. Eaton <jwe@octave.org>
parents: 8883
diff changeset
142
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
143 args.collapsedelimiters = true;
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
144 args.delimitertype = "default";
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
145
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
146 [reg, params] = parseparams (varargin);
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
147
16712
9ce08a1efc29 fix strsplit input validation
Mike Miller <mtmiller@ieee.org>
parents: 16557
diff changeset
148 if (nargin < 1)
9ce08a1efc29 fix strsplit input validation
Mike Miller <mtmiller@ieee.org>
parents: 16557
diff changeset
149 print_usage ();
9ce08a1efc29 fix strsplit input validation
Mike Miller <mtmiller@ieee.org>
parents: 16557
diff changeset
150 elseif (numel (reg) > 1)
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
151 print_usage ();
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
152 elseif (numel (reg) == 1)
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
153 if (islogical (reg{1}) || isnumeric (reg{1}))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
154 args.collapsedelimiters = reg{1};
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
155 else
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
156 print_usage ();
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
157 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
158 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
159 fields = fieldnames (args);
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
160 for n = 1:2:numel(params)
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
161 if (any (strcmpi (params{n}, fields)))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
162 args.(lower(params{n})) = params{n+1};
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
163 elseif (ischar (varargin{n}))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
164 error ("strsplit:invalid_parameter_name",
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
165 sprintf ("strsplit: Invalid parameter name, `%s'", varargin{n}))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
166 else
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
167 print_usage ();
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
168 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
169 endfor
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
170
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
171 if (strcmpi (args.delimitertype, "default"))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
172 if (nargin == 1 || numel (del) == 1
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
173 || (nargin > 1 && (islogical (del) || isnumeric (del)))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
174 || iscell (del) && all (cellfun (@numel, del) < 2))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
175 ## For single character delimiters, default to "legacy"
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
176 args.delimitertype = "legacy";
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
177 else
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
178 ## For multi-character delimiters, default to "simple"
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
179 args.delimitertype = "simple";
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
180 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
181 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
182
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
183 # Save the length of the "delimitertype" parameter
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
184 length_deltype = numel (args.delimitertype);
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
185
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
186 if (nargin == 1 || (nargin > 1 && (islogical (del) || isnumeric (del))))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
187 if (nargin > 1)
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
188 ## Second input is the "collapsedelimiters" parameter
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
189 args.collapsedelimiters = del;
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
190 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
191 ## Set proper default for the delimiter type
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
192 if (strncmpi (args.delimitertype, "simple", numel (args.delimitertype)))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
193 del = {" ","\f","\n","\r","\t","\v"};
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
194 elseif (strncmpi (args.delimitertype, "legacy", numel (args.delimitertype)))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
195 del = " \f\n\r\t\v";
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
196 else
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
197 del = "\\s";
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
198 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
199 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
200
16712
9ce08a1efc29 fix strsplit input validation
Mike Miller <mtmiller@ieee.org>
parents: 16557
diff changeset
201 if (! ischar (str) || (! ischar (del) && ! iscellstr (del)))
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
202 error ("strsplit: S and DEL must be string values");
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
203 elseif (! isscalar (args.collapsedelimiters))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
204 error ("strsplit: COLLAPSEDELIMITERS must be a scalar value");
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
205 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
206
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
207 if (strncmpi (args.delimitertype, "simple", length_deltype))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
208 if (iscellstr (del))
16557
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
209 del = cellfun (@do_string_escapes, del, "uniformoutput", false);
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
210 else
16557
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
211 del = do_string_escapes (del);
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
212 endif
16557
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
213 del = regexprep (del, '([^\w])', '\\$1');
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
214 endif
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
215
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
216 if (rows (str) > 1)
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
217 tmp = char (del(1));
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
218 str = [str, repmat(tmp,rows(str),1)];
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
219 str = reshape (str.', 1, numel (str));
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
220 str(end-numel(tmp)+1:end) = [];
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
221 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
222
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
223 if (isempty (str))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
224 result = {str};
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
225 elseif (strncmpi (args.delimitertype, "legacy", length_deltype))
16557
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
226 ## Legacy splitting is fast
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
227 if (! ischar (del))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
228 if (iscell (del) && all (cellfun (@numel, del) < 2))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
229 del = [del{:}];
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
230 else
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
231 error ("strsplit:legacy_delimiter_must_be_char",
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
232 "%s %s", "strsplit: for DELIMITERTYPE = ""legacy"" ",
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
233 "DEL must be a string, or a cell array scalar character elements.")
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
234 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
235 endif
16557
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
236 if (strcmp (typeinfo (del), "sq_string"))
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
237 del = do_string_escapes (del);
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
238 endif
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
239 ## Split str at each character contained in del
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
240 if (isscalar (del))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
241 ## Single separator
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
242 idx = find (str == del);
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
243 else
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
244 ## Multiple separators
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
245 idx = strchr (str, del);
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
246 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
247
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
248 ## Get substring lengths.
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
249 if (isempty (idx))
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
250 strlens = length (str);
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
251 else
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
252 strlens = [idx(1)-1, diff(idx)-1, numel(str)-idx(end)];
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
253 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
254 if (nargout > 1)
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
255 ## Grab the separators
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
256 matches = num2cell (str(idx)(:)).';
16554
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
257 if (args.collapsedelimiters)
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
258 ## Collapse the consequtive delimiters
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
259 ## TODO - is there a vectorized way?
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
260 for m = numel(matches):-1:2
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
261 if (strlens(m) == 0)
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
262 matches{m-1} = [matches{m-1:m}];
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
263 matches(m) = [];
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
264 endif
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
265 end
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
266 endif
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
267 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
268 ## Remove separators.
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
269 str(idx) = [];
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
270 if (args.collapsedelimiters)
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
271 ## Omit zero lengths.
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
272 strlens = strlens(strlens != 0);
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
273 endif
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
274
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
275 ## Convert!
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
276 result = mat2cell (str, 1, strlens);
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
277 elseif (strncmpi (args.delimitertype, "regularexpression", length_deltype)
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
278 || strncmpi (args.delimitertype, "simple", length_deltype))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
279 if (iscellstr (del))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
280 del = sprintf ('%s|', del{:});
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
281 del(end) = [];
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
282 endif
16554
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
283 if (args.collapsedelimiters)
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
284 del = ["(", del, ")+"];
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
285 endif
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
286 [result, ~, ~, ~, matches] = regexp (str, del, "split");
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
287 else
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
288 error ("strsplit:invalid_delimitertype",
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
289 sprintf ("strsplit: Invalid DELIMITERTYPE"))
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
290 endif
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
291 endfunction
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
292
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
293 % Mimic the old strsplit()
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
294 %!assert (cellfun (@numel, strsplit (["a,b,c";"1,2 "], ",")), [1 1 2 1 4])
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
295
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
296 %!shared str
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
297 %! str = "The rain in Spain stays mainly in the plain.";
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
298 % Split on all whitespace.
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
299 %!assert (strsplit (str), {"The", "rain", "in", "Spain", "stays", ...
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
300 %! "mainly", "in", "the", "plain."})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
301 % Split on "ain".
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
302 %!assert (strsplit (str, "ain"), {"The r", " in Sp", " stays m", ...
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
303 %! "ly in the pl", "."})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
304 % Split on " " and "ain" (treating multiple delimiters as one).
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
305 %!test
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
306 %! s = strsplit (str, '\s|ain', true, "delimitertype", "r");
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
307 %! assert (s, {"The", "r", "in", "Sp", "stays", "m", "ly", "in", "the", "pl", "."})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
308 %!test
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
309 %! s = strsplit (str, "\\s|ain", true, "delimitertype", "r");
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
310 %! assert (s, {"The", "r", "in", "Sp", "stays", "m", "ly", "in", "the", "pl", "."})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
311 %!test
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
312 %! [s, m] = strsplit (str, {"\\s", "ain"}, true, "delimitertype", "r");
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
313 %! assert (s, {"The", "r", "in", "Sp", "stays", "m", "ly", "in", "the", "pl", "."})
16554
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
314 %! assert (m, {" ", "ain ", " ", "ain ", " ", "ain", " ", " ", " ", "ain"})
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
315 % Split on " " and "ain", and treat multiple delimiters separately.
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
316 %!test
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
317 %! [s, m] = strsplit (str, {" ", "ain"}, "collapsedelimiters", false);
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
318 %! assert (s, {"The", "r", "", "in", "Sp", "", "stays", "m", "ly", "in", "the", "pl", "."})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
319 %! assert (m, {" ", "ain", " ", " ", "ain", " ", " ", "ain", " ", " ", " ", "ain"})
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
320
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
321 %!assert (strsplit ("road to hell"), {"road", "to", "hell"})
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
322 %!assert (strsplit ("road to hell", " "), {"road", "to", "hell"})
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
323 %!assert (strsplit ("road to^hell", {" ","^"}), {"road", "to", "hell"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
324 %!assert (strsplit ("road to--hell", {" ","-"}, true), {"road", "to", "hell"})
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
325 %!assert (strsplit (["a,bc,,de"], ",", false, "delimitertype", "s"), {"a", "bc", "", "de"})
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
326 %!assert (strsplit (["a,bc,,de"], ",", false), {"a", "bc", char(ones(1,0)), "de"})
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
327 %!assert (strsplit (["a,bc,de"], ",", true), {"a", "bc", "de"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
328 %!assert (strsplit (["a,bc,de"], {","," "}, true), {"a", "bc", "de"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
329
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
330 %!assert (strsplit ("road to hell", " ", "delimitertype", "r"), {"road", "to", "hell"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
331 %!assert (strsplit ("road to^hell", '\^| ', "delimitertype", "r"), {"road", "to", "hell"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
332 %!assert (strsplit ("road to^hell", "[ ^]", "delimitertype", "r"), {"road", "to", "hell"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
333 %!assert (strsplit ("road to--hell", "[ -]", false, "delimitertype", "r"), {"road", "", "", "to", "", "hell"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
334 %!assert (strsplit (["a,bc,de"], ",", "delimitertype", "r"), {"a", "bc", "de"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
335 %!assert (strsplit (["a,bc,,de"], ",", false, "delimitertype", "r"), {"a", "bc", "", "de"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
336 %!assert (strsplit (["a,bc,de"], ",", true, "delimitertype", "r"), {"a", "bc", "de"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
337 %!assert (strsplit (["a,bc,de"], "[, ]", true, "delimitertype", "r"), {"a", "bc", "de"})
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
338 %!assert (strsplit ("hello \t world", 1, "delimitertype", "r"), {"hello", "world"});
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
339
16411
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
340 %!assert (strsplit ("road to hell", " ", false, "delimitertype", "l"), {"road", "to", "hell"})
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
341 %!assert (strsplit ("road to^hell", " ^", false, "delimitertype", "l"), {"road", "to", "hell"})
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
342 %!assert (strsplit ("road to--hell", " -", true, "delimitertype", "l"), {"road", "to", "hell"})
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
343 %!assert (strsplit (["a,bc";",de"], ",", false, "delimitertype", "l"), {"a", "bc", char(ones(1,0)), "de "})
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
344 %!assert (strsplit (["a,bc";",de"], ",", true, "delimitertype", "l"), {"a", "bc", "de "})
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
345 %!assert (strsplit (["a,bc";",de"], ", ", true, "delimitertype", "l"), {"a", "bc", "de"})
5be43435bd5b Improve speed and backward compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 16403
diff changeset
346
16557
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
347 %!assert (strsplit ("foo\tbar", '\t', "delimitertype", "l"), {"foo", "bar"})
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
348 %!assert (strsplit ("foo\tbar", '\t', "delimitertype", "r"), {"foo", "bar"})
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
349 %!assert (strsplit ("foo\tbar", '\t', "delimitertype", "s"), {"foo", "bar"})
d50bca1cdc22 Support escaped characters in sq_strings for strsplit.m.
Ben Abbott <bpabbott@mac.com>
parents: 16554
diff changeset
350
16554
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
351 ## Test "match" for consecutive delmiters
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
352 %!test
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
353 %! [a, m] = strsplit ("a\t \nb", '\s', 'delimitertype', 'regularexpression',
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
354 %! 'collapsedelimiters', false);
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
355 %! assert (a, {"a", "", "", "b"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
356 %! assert (m, {"\t", " ", "\n"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
357 %!test
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
358 %! [a, m] = strsplit ("a\t \nb", '\s', false, 'delimitertype', 'regularexpression');
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
359 %! assert (a, {"a", "", "", "b"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
360 %! assert (m, {"\t", " ", "\n"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
361 %!test
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
362 %! [a, m] = strsplit ("a\t \nb", '\s', "delimitertype", "regularexpression");
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
363 %! assert (a, {"a", "b"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
364 %! assert (m, {"\t \n"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
365 %!test
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
366 %! [a, m] = strsplit ("a\t \nb", {"\t", " ", "\n"}, "delimitertype", "simple");
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
367 %! assert (a, {"a", "b"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
368 %! assert (m, {"\t \n"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
369 %!test
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
370 %! [a, m] = strsplit ("a123b", "123", "delimitertype", "legacy");
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
371 %! assert (a, {"a", "b"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
372 %! assert (m, {"123"})
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
373 %!test
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
374 %! [s, m] = strsplit ("hello \t world", 1);
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
375 %! assert (s, {"hello", "world"});
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
376 %! assert (m, {" \t "});
03a28487fa9d Collect collapsed delimiters in strsplit().
Ben Abbott <bpabbott@mac.com>
parents: 16411
diff changeset
377
13701
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
378 %% Test input validation
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
379 %!error strsplit ()
46e68badedb8 strsplit.m: Expand to accept 2-D character arrays. Improve input validation.
Rik <octave@nomad.inbox5.com>
parents: 12915
diff changeset
380 %!error strsplit ("abc", "b", true, 4)
16403
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
381 %!error <S and DEL must be string values> strsplit (123, "b")
1de4ec2a856d Matlab compatibility for strsplit()
Ben Abbott <bpabbott@mac.com>
parents: 15521
diff changeset
382 %!error <COLLAPSEDELIMITERS must be a scalar value> strsplit ("abc", "def", ones (3,3))
8877
2c8b2399247b implement strsplit; deprecate split
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
383