Matt Wilko
Matt Wilko

Reputation: 27322

Strange TrimEnd behaviour with \ char

I am using TrimEnd to remove certain characters from the end of a string. Initially I thought this would work:

    Dim strNew As String = "Employees\Sickness Entitlement.rpt"
    Dim strTrim As String = "Sickness Entitlement.rpt"
    Console.WriteLine(strNew.TrimEnd(strTrim)) '<- Doesn't work

But TrimEnd only works for an array of chars or a single char string, so I tried this:

    Dim strNew As String = "Employees\Sickness Entitlement.rpt"
    Dim strTrim As String = "Sickness Entitlement.rpt"

    Dim arrChars As Char()
    ReDim arrChars(strTrim.Length)
    For i As Integer = 0 To strTrim.Length - 1
        arrChars(i) = strTrim.Substring(i, 1)
    Next

    Console.WriteLine(strNew.TrimEnd(arrChars)) '<- Employees\

This works fine until I add in the slash:

    Dim strNew As String = "Employees\Sickness Entitlement.rpt"
    Dim strTrim As String = "\Sickness Entitlement.rpt"

    Dim arrChars As Char()
    ReDim arrChars(strTrim.Length)
    For i As Integer = 0 To strTrim.Length - 1
        arrChars(i) = strTrim.Substring(i, 1)
    Next

    Console.WriteLine(strNew.TrimEnd(arrChars)) '<- Employ

This now outputs: Employ

Is this somehow by design? It seems strange to me. The solution to my problem is do do something like:

    If strNew.EndsWith(strTrim) Then
        Console.WriteLine(strNew.Substring(0, strNew.LastIndexOf(strTrim)))
    End If

Which is both simpler and also works, but what is happening above?

Upvotes: 1

Views: 1550

Answers (2)

Will Dean
Will Dean

Reputation: 39500

TrimEnd is removing all the characters you give it, in any order it finds them until it gets to a character that's not in the list.

So when the \ is not in the list you provide, the trimming stops at the \. Once you include the \, the trim removes the \ and then sees 'ess' on the end of the string - both 'e' and 's' are already in the list you provided, so they get trimmed.

The Trim methods are completely unsuitable for what you're trying to do. If you're manipulating paths, use the Path.xxx methods. If you're just generally trying to chop up strings into sections use either Split(), or some appropriate combination of Substring() and whatever you need to find the splitting point.

Upvotes: 2

Konrad Rudolph
Konrad Rudolph

Reputation: 545588

Re-read the documentation of TrimEnd; you are using it wrong: TrimEnd will remove any char that is in the array from the end of the string, as long as it still finds such chars.

For example:

Dim str = "aaebbabab"
Console.WriteLine(str.TrimEnd(new Char() { "a"c, "b"c })

will output aa since it removes all trailing as and bs.

If your input looks exactly like in your example, your easiest recurse is to use Substring:

Console.WriteLine(strNew.Substring(0, strNew.Length - strTrim.Length))

Otherwise you can resort to regular expressions.

Upvotes: 2

Related Questions