Mattlinux1
Mattlinux1

Reputation: 807

How to strip a string from the point a hyphen is found within the string C#

I'm currently trying to strip a string of data that is may contain the hyphen symbol.

E.g. Basic logic:

string stringin = "test - 9894"; OR Data could be == "test";
if (string contains a hyphen "-"){
Strip stringin;
output would be "test" deleting from the hyphen.
}
Console.WriteLine(stringin);

The current C# code i'm trying to get to work is shown below:

    string Details = "hsh4a - 8989";
    var regexItem = new Regex("^[^-]*-?[^-]*$");
    string stringin;
    stringin = Details.ToString();

    if (regexItem.IsMatch(stringin)) {
    stringin = stringin.Substring(0, stringin.IndexOf("-") - 1); //Strip from the ending chars and - once - is hit.
    }
    Details = stringin;
    Console.WriteLine(Details);

But pulls in an Error when the string does not contain any hyphen's.

Upvotes: 1

Views: 273

Answers (5)

Andrei Dragotoniu
Andrei Dragotoniu

Reputation: 6335

you don't need a regex for this. A simple IndexOf function will give you the index of the hyphen, then you can clean it up from there.

This is also a great place to start writing unit tests as well. They are very good for stuff like this.

Here's what the code could look like :

string inputString = "ho-something";
string outPutString = inputString;

            var hyphenIndex = inputString.IndexOf('-');
            if (hyphenIndex > -1)
            {
                outPutString = inputString.Substring(0, hyphenIndex);
            }

            return outPutString;

Upvotes: 1

NValchev
NValchev

Reputation: 3015

I wouldn't use regex for this case if I were you, it makes the solution much more complex than it can be. For string I am sure will have no more than a couple of dashes I would use this code, because it is one liner and very simple:

string str= entryString.Split(new [] {'-'}, StringSplitOptions.RemoveEmptyEntries)[0]; 

If you know that a string might contain high amount of dashes, it is not recommended to use this approach - it will create high amount of different strings, although you are looking just for the first one. So, the solution would look like something like this code:

int firstDashIndex = entryString.IndexOf("-");
string str = firstDashIndex > -1? entryString.Substring(0, firstDashIndex) : entryString;

Upvotes: 1

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186823

It seems that you want the (sub)string starting from the dash ('-') if original one contains '-' or the original string if doesn't have dash. If it's your case:

  String Details = "hsh4a - 8989";
  Details = Details.Substring(Details.IndexOf('-') + 1);

Upvotes: 1

Jamiec
Jamiec

Reputation: 136174

Your regex is asking for "zero or one repetition of -", which means that it matches even if your input does NOT contain a hyphen. Thereafter you do this

stringin.Substring(0, stringin.IndexOf("-") - 1)

Which gives an index out of range exception (There is no hyphen to find).

Make a simple change to your regex and it works with or without - ask for "one or more hyphens":

var regexItem = new Regex("^[^-]*-+[^-]*$");
    here -------------------------^

Upvotes: 2

Hari Prasad
Hari Prasad

Reputation: 16966

How about just doing this?

stringin.Split('-')[0].Trim();

You could even specify the maximum number of substrings using overloaded Split constructor.

stringin.Split('-', 1)[0].Trim();

Upvotes: 3

Related Questions