strange behavior from Regex.Split & myString.IndexOf

strange behavior from Regex.Split & myString.IndexOf

am 02.04.2008 02:55:16 von mad.scientist.jr

I am working in C# ASP.NET framework 1.1 and
for some reason Regex.Split isn't working as expected.
When trying to split a string, Split is returning an array
with the entire string in element [0] and an empty string in element
[1].
I am trying two different ways (an ArrayList and a string array)
and both are doing that. Also, IndexOf is not working,
but StartsWith does.

The code:

using System.Text.RegularExpressions;
...
// some code to find CheckBoxList controls in
Request.Form
// look at Request.Form keys and split out delimiter
// which sometimes is "$" (ie "CheckBoxList1$1")
// and sometimes ":" (ie CheckBoxList1:1)
// (is there any property for what .NET uses?), so to
get delim we
// use a function to return 1st non alphanum char
after control name
string _sIndexDelim =
GetControlNameDelimiter(CheckBoxList1.ID);
foreach (string _key in
HttpContext.Current.Request.Form.AllKeys)
{
//FOR SOME ODD REASON, THIS DOESN'T WORK:
//if (_key.IndexOf(CheckBoxList1.ID +
_sIndexDelim, 1) > 0)
// BUT THIS WORKS (?)
if (_key.StartsWith(CheckBoxList1.ID +
_sIndexDelim))
{
_arrKey = new ArrayList();
_arrKey.AddRange(Regex.Split(_key,
_sIndexDelim)); // does not split!
string[] substrings = Regex.Split(_key,
_sIndexDelim); // does not split!

The values:

?_key
"CheckBoxList1$1"
?_sIndexDelim
"$"

?_arrKey[0]
"CheckBoxList1$1"
?_arrKey[1]
""

?substrings[0]
"CheckBoxList1$1"
?substrings[1]
""

Any ideas why this is happening?

Thanks

Re: strange behavior from Regex.Split & myString.IndexOf

am 02.04.2008 03:02:30 von Peter Duniho

On Tue, 01 Apr 2008 17:55:16 -0700, wrote:

> I am working in C# ASP.NET framework 1.1 and
> for some reason Regex.Split isn't working as expected.
> When trying to split a string, Split is returning an array
> with the entire string in element [0] and an empty string in element
> [1].
> I am trying two different ways (an ArrayList and a string array)
> and both are doing that. Also, IndexOf is not working,
> but StartsWith does.

On the latter point, I don't understand what you mean. In the code you
posted, IndexOf() is going to be 0 if the string actually passes the test
that StartsWith() applies. But you are checking for "> 0". The two lines
you wrote are definitely not logically equivalent.

As far as Regex.Split() goes, surely this has to do with the fact that the
"$" character is a special regular expression character. If you don't
want to apply an actual regular expression to your string processing,
don't use Regex. That's where the name "Regex" comes from: "REGular
EXpression".

Use String.Split() instead.

Pete

Re: strange behavior from Regex.Split & myString.IndexOf

am 02.04.2008 03:17:47 von mad.scientist.jr

Aha... string.IndexOf is 0 based. Silly mistake on my part. Duh

I can think of other places where I would want to use Regex.split
because it lets you split by more than one character. So you would
need to escape any delimiter characters that would be interpreted as a
regular expression? Did not know that.

Thanks

On Apr 1, 9:02 pm, "Peter Duniho"
wrote:
> On Tue, 01 Apr 2008 17:55:16 -0700, wrote:
> > I am working in C# ASP.NET framework 1.1 and
> > for some reason Regex.Split isn't working as expected.
> > When trying to split a string, Split is returning an array
> > with the entire string in element [0] and an empty string in element
> > [1].
> > I am trying two different ways (an ArrayList and a string array)
> > and both are doing that. Also, IndexOf is not working,
> > but StartsWith does.
>
> On the latter point, I don't understand what you mean. In the code you
> posted, IndexOf() is going to be 0 if the string actually passes the test
> that StartsWith() applies. But you are checking for "> 0". The two lines
> you wrote are definitely not logically equivalent.
>
> As far as Regex.Split() goes, surely this has to do with the fact that the
> "$" character is a special regular expression character. If you don't
> want to apply an actual regular expression to your string processing,
> don't use Regex. That's where the name "Regex" comes from: "REGular
> EXpression".
>
> Use String.Split() instead.
>
> Pete

Re: strange behavior from Regex.Split & myString.IndexOf

am 02.04.2008 03:47:44 von Peter Duniho

On Tue, 01 Apr 2008 18:17:47 -0700, wrote:

> Aha... string.IndexOf is 0 based. Silly mistake on my part. Duh
>
> I can think of other places where I would want to use Regex.split
> because it lets you split by more than one character.

String.Split() does too. Just pass it strings instead of characters.

> So you would
> need to escape any delimiter characters that would be interpreted as a
> regular expression? Did not know that.

Yes...if you want characters that would ordinarily be interpreted as a
control character for the regular expression, it needs to be escaped.
Just as is the case any time you might have special characters embedded in
a string (like quote, newline, etc. for plain old string literals).

Pete

Re: strange behavior from Regex.Split & myString.IndexOf

am 04.04.2008 09:06:49 von Jesse Houwing

Hello mad.scientist.jr@gmail.com,

This isn't working because $ has a special meaning in Regular expressions
(end of line, or end of input).

To make sure the regex works with any input use string regex = Regex.Escape("$");

which should make it \$.


Jesse

> I am working in C# ASP.NET framework 1.1 and
> for some reason Regex.Split isn't working as expected.
> When trying to split a string, Split is returning an array
> with the entire string in element [0] and an empty string in element
> [1].
> I am trying two different ways (an ArrayList and a string array)
> and both are doing that. Also, IndexOf is not working,
> but StartsWith does.
> The code:
>
> using System.Text.RegularExpressions;
> ...
> // some code to find CheckBoxList controls in
> Request.Form
> // look at Request.Form keys and split out delimiter
> // which sometimes is "$" (ie "CheckBoxList1$1")
> // and sometimes ":" (ie CheckBoxList1:1)
> // (is there any property for what .NET uses?), so to
> get delim we
> // use a function to return 1st non alphanum char
> after control name
> string _sIndexDelim =
> GetControlNameDelimiter(CheckBoxList1.ID);
> foreach (string _key in
> HttpContext.Current.Request.Form.AllKeys)
> {
> //FOR SOME ODD REASON, THIS DOESN'T WORK:
> //if (_key.IndexOf(CheckBoxList1.ID +
> _sIndexDelim, 1) > 0)
> // BUT THIS WORKS (?)
> if (_key.StartsWith(CheckBoxList1.ID +
> _sIndexDelim))
> {
> _arrKey = new ArrayList();
> _arrKey.AddRange(Regex.Split(_key,
> _sIndexDelim)); // does not split!
> string[] substrings = Regex.Split(_key,
> _sIndexDelim); // does not split!
> The values:
>
> ?_key
> "CheckBoxList1$1"
> ?_sIndexDelim
> "$"
> ?_arrKey[0]
> "CheckBoxList1$1"
> ?_arrKey[1]
> ""
> ?substrings[0]
> "CheckBoxList1$1"
> ?substrings[1]
> ""
> Any ideas why this is happening?
>
> Thanks
>
--
Jesse Houwing
jesse.houwing at sogeti.nl