Adam S
Adam S

Reputation: 9235

Help writing a regular expression

I asked a very similar question to this one almost a month ago here.

I am trying very hard to understand regular expressions, but not a bit of it makes any sense. SLak's solution in that question worked well, but when I try to use the Regex Helper at http://gskinner.com/RegExr/ it only matches the first comma of -2.2,1.1-6.9,2.3-12.8,2.3 when given the regex ,|(?<!^|,)(?=-)

In other words I can't find a single regex tool that will even help me understand it. Well, enough whining. I'm now trying to re-write this regex so that I can do a Regex.Split() to split up the string 2.2 1.1-6.9,2.3-12.8 2.3 into -2.2, 1.1, -6.9, 2.3, -12.8, and 2.3.

The difference the aforementioned question is that there can now be leading and/or trailing whitespace, and that whitespace can act as a delimiter as can a comma.

I tried using \s|,|(?<!^|,)(?=-) but this doesn't work. I tried using this to split 293.46701,72.238185, but C# just tells me "the input string was not in a correct format". Please note that there is leading and trailing whitespace that SO does not display correctly.

EDIT: Here is the code which is executed, and the variables and values after execution of the code. enter image description here

Upvotes: 0

Views: 247

Answers (5)

Town
Town

Reputation: 14906

Unless I'm missing the point entirely (it's Sunday night and I'm tired ;) ) I think you need to concentrate more on matching the things you do want and not the things you don't want.

Regex argsep = new Regex(@"\-?[0-9]+\.?[0-9]*");
string text_to_split = "-2.2 1.1-6.9,2.3-12.8 2.3 293.46701,72.238185";
var tmp3 = argsep.Matches(text_to_split);

This gives you a MatchCollection of each of the values you wanted.

To break that down and try and give you an understanding of what it's saying, split it up into parts:

\-? Matches a literal minus sign (\ denotes literal characters) zero or one time (?)
[0-9]+ Matches any character from 0 to 9, one or more times (+)
\.? Matches a literal full stop, zero or one time (?)
[0-9]* Matches any character from 0 to 9 again, but this time it's zero or more times (*)

You don't need to worry about things like \s (spaces) for this regex, as the things you're actually trying to match are the positive/negative numbers.

Upvotes: 1

rasmusvhansen
rasmusvhansen

Reputation: 1522

If it doesn't have to be Regex, and if it doesn't have to be slow :-) this should do it for you:

var components = "2.2 1.1-6.9,2.3-12.8 2.3".Replace("-", ",-").
Split(new[]{' ', ','},StringSplitOptions.RemoveEmptyEntries);

Components would then contain:[2.2 1.1 -6.9 2.3 -12.8 2.3]

Upvotes: 5

svrist
svrist

Reputation: 7110

If the "Matches" approach doesnt work you could perhaps hack something in two steps?

Regex RE = new Regex(@"(-?[\d.]+)|,|\s+");
RE.Split(" -2.2,1.1-6.9,2.3-12.8,2.3 ")
       .Where(s=>!string.IsNullOrEmpty(s))

Outputs:

-2.2
1.1
-6.9
2.3
-12.8
2.3

Upvotes: 0

Andy Edinborough
Andy Edinborough

Reputation: 4417

Does it need to be split? You could do Regex.Matches(text, @"\-?[\d]+(\.[\d]+)?").

If you need split, Regex.Split(text, @"[^\d.-]+|(?=-)") should work also.

P.S. I used Regex Hero to test on the fly http://regexhero.net

Upvotes: 1

Zebi
Zebi

Reputation: 8882

Consider using the string split function. String operations are way faster than regular expressions and much simpler to use/understand.

Upvotes: 0

Related Questions